spring-boot - Solace Queue - 消息应在异常情况下自动重新传递,而无需重新连接会话
问题描述
我们计划使用 Solace Queue Management。用例之一是,在消费者收到消息后,如果在处理消息时出现任何异常,应该自动重新传递消息。
截至目前,我没有向队列发送确认消息,因此消息不会从队列中删除,但不幸的是它无法自动重新传递。如果我重新启动会话,那么只有我能够收到相同的消息。
我已经探索了几个选项。session.rollback 或 session.revoke 异常,但它会增加队列中所有消息的传递计数。此外,没有任何延迟时间配置来重新传递相同的消息。
期望是,相同的消息应该在 30 分钟(配置的延迟)后自动重新传递。
以下是我用于消费者的示例代码:
@Override
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
System.out.printf("TextMessage received: '%s'%n", ((TextMessage) message).getText());
} else {
System.out.println("Message received.");
}
System.out.printf("Message Content:%n%s%n", SolJmsUtility.dumpMessage(message));
// ACK the received message manually because of the set SupportedProperty.SOL_CLIENT_ACKNOWLEDGE above
message.acknowledge();
latch.countDown(); // unblock the main thread
} catch (JMSException ex) {
System.out.println("Error processing incoming message.");
ex.printStackTrace();
}
}
感谢您的支持。谢谢
解决方案
Solace 目前不支持此类功能。消息不会在应用层重新传递。仅当重新建立连接(准确地说是流)时,才会重新传递它们。
Solace 确实在传输级别重新传递消息。这样做的目的是确保将消息传递到应用程序缓冲区。从那时起,它的应用程序负责处理它们并确认。超过该点重新传递将导致在消费者端重复消息——这将违反包括 JMS 在内的多个协议。
当应用程序流重新建立时,任何未确认的消息都可以安全地重新传递,因为我们知道它被传递到的原始流不能再确认消息(并导致潜在的重复消息传递)。
推荐阅读
- javascript - 更新被定义为较大对象中的变量引用位置的 JS 对象的一部分
- powershell - 具有数组属性的 Powershell pscustomobject 到 Csv 文件
- c# - 使用 google Api 编辑谷歌文档,无需在 c# 中上传到谷歌驱动器
- bootstrap-vue - 即使启用了 Bootstrap-Vue B-Form-Checkbox 也不会对点击做出反应
- android - Android上的TextView X + Y滚动
- node.js - npm firstline 包不返回第一行(字符串)而是一个 promise 对象,如何获取第一行字符串?
- python - 查找列表中的每个值都出现在 df 中的索引
- microsoft-cognitive - 为什么部署后的测试结果和 ASR 输出在 Microsoft 自定义语音中不同?
- kotlin - Kotlin 协程并行化
- python - 如何打印给定输入的前一个和下一个数字?