我有一个基于HornetQ的JMS提供程序,并且使用者在CLIENT_ACKNOWLEDGE_MODE中附加到提供程序。 message.acknowledge()片段虽然在if else下。因此,如果在处理消息时出现应用程序层故障,消费者有时不会向服务器发送确认。这里有两个问题 -
1)服务器中排队的邮件会继续存在 即使消费者不承认,也流向消费者 如上所述的消息
2)重新启动时,未确认的消息是否会再次流下来 消费者。
这些是我对我提出的问题的一些看法
1)消息继续按照消费者流向消费者 消费者日志,即使它没有确认其中一条消息 由于应用程序层故障导致服务器(注意,有 没有未被捕获的例外,只是消费者没有 承认)。
2)其次,在重新启动消费者时,消息没有 从服务器再次流下来,这是令人惊讶的。
有人可以澄清这种行为吗?
答案 0 :(得分:0)
很难完全确定您的应用程序在消息确认方面做了什么,但我的猜测是,在尝试确认相关消息失败后,您将继续确认消息。在这种情况下,因为您正在使用客户端确认模式,下一个确认也将应用于上一个消息,因为这就是客户端模式的工作方式。
Session.CLIENT_ACKNOWLEDGE:客户端通过调用消息的确认方法来确认消息。在此模式下,确认在会话级别进行:确认已消耗的消息会自动确认收到其会话已使用的所有消息。例如,如果消息使用者消耗了10条消息,然后确认传递了第5条消息,则会确认所有10条消息。
因此,如果您仔细阅读,您将看到会话中的消费者如何在客户端确认模式下确认消息甚至可能会相互影响。
为了获得更好的答案,您需要进一步细分事件链,以便更清楚地了解正在发生的事情。