如果消息消费后出现错误,如何在JMS消息队列中保存消息?

2022-09-04 19:34:32

我的场景是 - 我将消息发布到队列中,一旦消息被消耗,我就将其发送到第三方中间件应用程序。如果该中间件应用程序已关闭,那么我发布的消息就被扔掉了。如果中间件应用程序关闭,我不想丢失该消息,而是希望它处于保留状态或在队列中等待。请建议,如何处理这种情况?


答案 1

您应该像这样创建会话:

Session session = connection.createSession(false,
                       Session.CLIENT_ACKNOWLEDGE);

当您尝试将消息传递到第三方应用时:

  • 如果它有效,您应该确认该消息。

  • 如果它关闭了,你不应该放弃它,这样JMS提供者将能够重新调整它,并且消息不会丢失。message.acknowledge();

另外,你可以看看这个:JMS AUTO_ACKNOWLEDGE什么时候得到承认?


答案 2

JMS 队列不是消息存储库。

如果您有一个“坏消息”,而该消息的处理继续失败,那么 JMS 服务器(如果已配置)将不可避免地将该消息转储到“死消息队列”,该队列将缓慢填满,直到另一个进程将其耗尽。

您不希望将坏消息保留在队列中,因为它们可能会阻塞队列(假设您有 10 个使用者,而前 10 个消息都是坏消息,因此所有进程所做的就是继续在坏消息上摇摆不定 - 使队列停止)。

因此,您需要一些机制将消息存储到异常接收器中,然后可以在其中将它们注入主队列进行处理。

死消息队列不是这种机制(不要将消息存储在 JMS 队列中),而是一种将异常消息路由到更永久的存储区域(即数据库表或其他东西)的机制。

到达那里后,可以对其进行审查(自动,手动,无论什么),并重新交付或取消。

但关键的一点是,你需要一个外部机制来做到这一点,JMS服务器本身并不适合这类消息。


推荐