【问题标题】:How the consume can notify the JMS queue to hold the message消费如何通知 JMS 队列来保存消息
【发布时间】:2015-09-19 15:53:52
【问题描述】:

我的场景是,我听一个队列。如果发布了一条消息,我将使用它并将其转发到另一个应用程序。

有没有可能当发现app宕机时,我可以通知队列,以某种方式保留消息,这样我就收不到消息了。然后当应用程序回来时,我会通知队列我可以再次处理消息。

“CLIENT_ACKNOWLEDGE”模式似乎对这种情况没有帮助。

在这方面的帮助将不胜感激。提前致谢。

【问题讨论】:

  • 当您的应用程序关闭时关闭您的 JMS 连接并在您的应用程序启动后重新建立连接怎么样?确保队列中消息的超时设置为“0”,以便它们持久存在。你可以看下面了解JMS持久化docs.oracle.com/javaee/1.4/api/javax/jms/…
  • @kalyan,感谢您的回答。它应该适合我的情况。

标签: java queue jms


【解决方案1】:

一般来说,你有两种可能:

  1. 停止使用这些消息。在这种情况下,消息将保留在队列中,直到您恢复处理。
  2. 生成另一个队列作为反向通道,并通过此队列将停止/启动消息发送给消息的生产者。这也可以看作是背压的一种实现。

恕我直言,1. 在大多数情况下应该足够了。 2. 如果生成的消息量导致您想要避免的大量资源(内存/磁盘)消耗,这将是必要的。您仍然可以使用两者的组合,例如如果应用停止运行超过一段时间,您会通知生产者。

【讨论】:

    【解决方案2】:

    我可以建议以下解决方案。请注意,#1、#2 是“手动”,#3 是“真实”。选择取决于您的需求。

    1. 在使用消息之前检查应用程序的可用性。这会起作用,但有一个问题:如果应用程序在您使用消息的那一刻变得不可用怎么办?
    2. 使用消息,尝试将其发送到您的应用。如果尝试失败,则将消息推送回同一队列。但是请注意此解决方案:如果您将消息推送到队列中,您会立即再次使用它,尝试将其发送到可能仍然不可用的应用程序,再次将其推送到队列等。
    3. 真正的解决方案是使用事务。这正是您所需要的。如果应用程序不可用,则抛出异常。这将自动启动重试机制。

    【讨论】:

    • 感谢您的回答。但是对于我的情况,停止监听队列是最简单的实现方式。 :)
    猜你喜欢
    • 2015-07-27
    • 2013-08-08
    • 1970-01-01
    • 2015-02-02
    • 2018-01-28
    • 2011-12-22
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    相关资源
    最近更新 更多