是否将非持久性JMS消息重新传递给非持久性订户?

假设我向非耐用订户发送了一条消息,但是订户未能确认该消息。服务器会尝试重新传递消息还是仅持久订阅者才能进行重新交付?结果是否取决于消息是持久的还是非持久的?

在Mark Richards的《 Java消息服务》一书中,我没有找到明确的答案,但有两个看似矛盾的说法:

  

cknowledge()方法通知JMS提供者该消息已被消费者成功接收。如果在确认过程中发生提供者故障,则此方法会向客户端抛出异常。提供程序失败导致消息被JMS服务器保留以重新发送。

这表明邮件已重新发送。

  

如果提供商在将消息传递给具有非持久订阅的使用者时失败,则消息可能会丢失。如果持久订阅者收到消息,并且在将确认返回给提供者之前发生了故障,那么JMS提供者将认为该消息未传递,并将尝试重新传递它。

好的,所以消息 可能会丢失,即未重新发送,但这取决于什么情况?

持久性订户和非持久性消息的组合甚至还有用例吗?

zjbyyd1 回答:是否将非持久性JMS消息重新传递给非持久性订户?

您引用的每条语句实质上表明最终结果取决于提供者是否遇到“失败”。您问题的答案取决于这是哪种失败。

在第一篇有关消息确认的报价单中,我相信作者是在确认过程中经纪人内部发生故障,其中经纪人过程仍然存在,但由于某些内部原因而失败。

在关于非持久订阅的第二个引用中,我相信作者正在谈论在将消息传递给使用者(由于某种原因(例如JVM崩溃,硬件故障)而终止)的使用者的过程中,代理失败。等)。在这种情况下,非持久订阅中的所有消息都将丢失,因为该订阅实际上是非持久的。

作为经纪人开发人员,我实际上并不真正将此消息视为“损失”,因为这是非持久订阅的预期语义。因为它是非持久性的,所以它不能在代理重新启动后继续存在(无论重新启动的根本原因是什么)。我认为消息丢失是消息的意外删除。经纪人绝不应该丢失消息。

本文链接:https://www.f2er.com/3138009.html

大家都在问