I’m trying to dequeue using Oracle 11g queue using standlone java. Here is the code:
public class testq {
public static void main(String[] args) throws Exception {
testq q = new testq();
AQSession aq_sess = createSession();
q.runTest(aq_sess);
}
public static AQSession createSession() {
Connection db_conn;
AQSession aq_sess = null;
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
/* Load the Oracle8i AQ driver: */
Class.forName("oracle.AQ.AQOracleDriver");
db_conn = DriverManager.getConnection("jdbc:oracle:thin:@10.10.10.10:1521:demo", "demo_app", "demo");
System.out.println("JDBC Connection opened ");
db_conn.setAutoCommit(false);
/* Creating an AQ Session: */
aq_sess = AQDriverManager.createAQSession(db_conn);
System.out.println("Successfully created AQSession ");
}
catch (Exception ex) {
System.out.println("Exception: " + ex);
ex.printStackTrace();
}
return aq_sess;
}
public void runTest(AQSession aq_sess) {
//AQQueueTable q_table;
AQQueue queue;
AQMessage message;
AQRawPayload raw_payload;
AQDequeueOption deq_option;
byte[] b_array;
Connection db_conn;
try {
db_conn = ((AQOracleSession)aq_sess).getDBConnection();
/* Get a handle to a queue - aq_queue4 in aquser schema: */
queue = aq_sess.getQueue ("myadmin", "STREAM_QUEUE_DEMO");
System.out.println("Successful getQueue");
/* Creating a AQDequeueOption object with default options: */
deq_option = new AQDequeueOption();
deq_option.setDequeueMode(AQDequeueOption.DEQUEUE_REMOVE);
/* Set wait time to 10 seconds: */
deq_option.setWaitTime(10);
/* Dequeue a message: */
message = queue.dequeue(deq_option);
System.out.println("Successful dequeue");
/* Retrieve raw data from the message: */
raw_payload = message.getRawPayload();
b_array = raw_payload.getBytes();
db_conn.commit();
String value = new String(b_array);
System.out.println("queue="+value);
} catch(Exception e) {
e.printStackTrace();
}
}
But I’m getting error at below line:
message = queue.dequeue(deq_option);
The error says
oracle.AQ.AQException: JMS-174: Class must be specified for queues with object payloads
Use dequeue(deq_option, payload_fact) or dequeue(deq_option, sql_data_cl)
Can any one help me out to fix this error? I need to bulk dequeue the message at once.
Thanks!
What exactly are you en-queuing ? i.e. what is your payload ?
When you create a Oracle Streams AQ, you have to specify a payload type that will be enqueued in the Q.
And for object payload types, you have to add the class information in the AQSession before de-queuing. e.g. we dequeue Oracles native XMLType object, so we have to add the following piece of code right after the session is created.
You’ll have to do something similar, based on your payload type.