java - 如何在 Oracle AQ 中停止在未确认的情况下删除消息?
问题描述
我已经建立了一个单一的客户 Oracle AQ。我在具有CLIENT_ACKNOWLEDGE
模式的 Java Web 应用程序中观察来自此队列的消息。但是,一旦我收到该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);
}
}
解决方案
您正在创建一个单一的消费者队列,一旦成功消费,该消息就会被删除。
要保留消息,请在创建队列时将保留时间设置为大于零的值。
BEGIN
DBMS_AQADM.CREATE_QUEUE(
Queue_name => 'TESTUSER.myqueue',
Queue_table => 'TESTUSER.myqueuetable',
Queue_type => 0, Max_retries => 5, Retry_delay => 0,
retention_time => 300 -- retain for next 5 minutes
);
END;
/
参考https://docs.oracle.com/database/121/ARPLS/d_aqadm.htm#ARPLS109
推荐阅读
- scala - 由于类型不匹配,Json4s 自定义序列化程序不起作用
- angular - 如何导航到位于主路由器插座中显示的组件中的辅助路由器插座?
- android - 我的按钮的透明度不起作用。我也在尝试添加边框
- c# - 如何避免在 WPF 中覆盖窗口范围的样式?
- python - 如何将以下 c++ 代码转换为 python
- microservices - 为什么消费者必须在尤里卡服务器上注册?
- sql-server - 以后出现错误时,看不到预期的 PRINT 或 RAISERROR 输出
- python - (Django,Python)如何修复 json.decoder.JSONDecodeError?
- ios - WKWebView 中的蒙版图像受 CORS 限制
- mysql - 如何在 SQL 中创建两个连续的 Group By