【发布时间】:2020-03-05 01:54:02
【问题描述】:
假设我向非持久订阅者发送消息,但订阅者未能确认消息。服务器会尝试重新传递消息还是只针对持久订阅者进行重新传递?结果是否取决于消息是持久的还是非持久的?
在 Mark Richards 的《Java 消息服务》一书中,我没有找到明确的答案,但有两个看似矛盾的陈述:
acknowledge() 方法通知 JMS 提供者消息已被消费者成功接收。如果在确认过程中发生提供程序故障,此方法将向客户端抛出异常。提供程序失败会导致 JMS 服务器保留消息以进行重新传递。
这表明消息已重新传递。
如果提供者在将消息传递给具有非持久订阅的消费者时失败,则消息可能会丢失。如果持久订阅者收到一条消息,并且在向提供者返回确认之前发生了故障,则 JMS 提供者认为该消息未传递并将尝试重新传递它。
好的,那么消息可能会丢失,即没有重新发送,但这取决于什么情况?
是否有组合持久订阅者和非持久消息的用例?
【问题讨论】:
-
我的回答是否解决了您的问题?如果是这样,请将其标记为这样,以帮助将来可能有同样问题的其他人。谢谢!