我正在为企业级产品编写Java组件,并希望利用Oracle 11g数据库的特定功能Active Queues。我要完成的确切场景是-1.在提交时向oracle活动队列/队列表中写入一条消息2.使用JMS使用者从队列中读取该消息
我在http://docs.oracle.com/cd/B28359_01/java.111/b31224/streamsaq.htm上观看了演示和教程。
特别是,我想重点介绍代码的入队部分-
// Create the actual AQMessage instance:
AQMessage mesg = AQFactory.createAQMessage(msgprop);
// and add a payload:
byte[] rawPayload = new byte[500];
for (int i = 0; i < rawPayload.length; i++) {
rawPayload[i] = 'b';
}
mesg.setPayload(new RAW(rawPayload));
AQEnqueueOptions opt = new AQEnqueueOptions();
opt.setRetrieveMessageId(true);
opt.setDeliveryMode(AQEnqueueOptions.DeliveryMode.PERSISTENT);
opt.setVisibility(AQEnqueueOptions.VisibilityOption.ON_COMMIT);
// execute the actual enqueue operation:
conn.enqueue(queueName, opt, mesg);
Run Code Online (Sandbox Code Playgroud)
这对我来说效果很好,因为我们要确保仅在提交事务后,该消息才对消费者可见。
问题-在演示中,我们创建有效负载类型RAW的队列
doUpdateDatabase(conn,
"BEGIN "+
"DBMS_AQADM.CREATE_QUEUE_TABLE( "+
" QUEUE_TABLE => '"+USERNAME+".RAW_SINGLE_QUEUE_TABLE', "+
" QUEUE_PAYLOAD_TYPE => 'RAW', "+
" COMPATIBLE => …Run Code Online (Sandbox Code Playgroud)