如何停止删除未经甲骨文AQ确认的消息?

问题描述 投票:0回答:1

我已经建立了一个客户Oracle AQ。我在Java Web应用程序中以CLIENT_ACKNOWLEDGE模式观察到来自此队列的消息。但是,一旦我收到onMessage方法中的消息,这些消息似乎就会从Oracle队列中删除。我的假设是,除非我在客户端中将它们acknowledge删除,否则不应删除该消息。如何停止呢?

Oracle队列架构看起来像这样:

BEGIN DBMS_AQADM.CREATE_QUEUE_TABLE(
  Queue_table => '"TESTUSER"."myqueuetable"', 
  Queue_payload_type => 'TESTUSER.messageobject', 
  multiple_consumers => false
);
END;
/

BEGIN DBMS_AQADM.CREATE_QUEUE(
  Queue_name => 'TESTUSER.myqueue', 
  Queue_table => 'TESTUSER.myqueuetable', 
  Queue_type => 0, Max_retries => 5, Retry_delay => 0
);
END;
/

BEGIN dbms_aqadm.start_queue (
  queue_name => 'testuser.myqueue'
);
END;

我这样观察我的Java应用程序中的消息

 //somewhere in my app
session = queueConnection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE);
queueReceiver = ((AQjmsSession) databaseConnectionManager.getSession())
 .createReceiver(databaseConnectionManager.getQueue(), Messageobject.getORADataFactory());
queueReceiver.setMessageListener(this);


//in my listener class
@Override
public void onMessage(Message message) {
 AdtMessage msg = (AdtMessage) message;

 try {
  Messageobject message = (Messageobject) msg.getAdtPayload();

  if (isUserConnected(message.userId)) {
   logger.debug("Message acknowledged");
   msg.acknowledge();
   //handle the message. the message should be deleted now.
  } else {
   //i don't want the message to be deleted
  }

 } catch (JMSException | IllegalArgumentException | SQLException e) {
  logger.error("An error occurred while sending an outgoing blob", e);
 }
}
java oracle jms jax-ws oracle-aq
1个回答
0
投票

您正在创建一个使用者队列,一旦消息被成功使用,该消息将被删除。

© www.soinside.com 2019 - 2024. All rights reserved.