消费者如何通知 JMS 队列保存消息
How the consume can notify the JMS queue to hold the message
我的场景是,我听一个队列。如果发布了一条消息,我将使用它并将其转发到另一个应用程序。
有没有可能在发现app宕机的时候,通知队列,通过某种方式,把消息hold住,这样我就收不到消息了。然后当应用程序回来时,我会通知队列我可以再次处理消息。
看来 "CLIENT_ACKNOWLEDGE" 模式对这种情况没有帮助。
在这方面的帮助将不胜感激。提前致谢。
一般来说,你有两种可能:
- 只是停止使用消息。在这种情况下,消息将保留在队列中,直到您恢复处理。
- 生成另一个队列作为反向通道,并通过该队列将 stop/start 消息发送给消息的生成者。这也可以看作是背压的一种实现。
恕我直言,1. 在大多数情况下应该足够了。 2. 如果生成的消息量导致您想要避免的大量资源 (memory/disk) 消耗,则将是必要的。你仍然可以使用两者的组合,例如如果应用程序停机时间超过一段时间,您会通知制作人。
我可以建议以下解决方案。请注意#1、#2 是 "manual",#3 是 "real"。选择取决于您的需要。
- 在使用消息之前检查应用程序可用性。这会工作,但有一个问题:如果应用程序恰好在您使用消息的那一刻变得不可用怎么办?
- 消费消息,尝试将其发送到您的应用程序。如果尝试失败,将消息推回同一个队列。但是要小心这个解决方案:如果你将消息推送到队列,你会立即再次使用它,尝试将它发送到可能仍然不可用的应用程序,再次将它推送到队列等。
- 真正的解决方案是使用事务。这正是您所需要的。如果应用程序不可用,则抛出异常。这将自动启动重试机制。
我的场景是,我听一个队列。如果发布了一条消息,我将使用它并将其转发到另一个应用程序。
有没有可能在发现app宕机的时候,通知队列,通过某种方式,把消息hold住,这样我就收不到消息了。然后当应用程序回来时,我会通知队列我可以再次处理消息。
看来 "CLIENT_ACKNOWLEDGE" 模式对这种情况没有帮助。
在这方面的帮助将不胜感激。提前致谢。
一般来说,你有两种可能:
- 只是停止使用消息。在这种情况下,消息将保留在队列中,直到您恢复处理。
- 生成另一个队列作为反向通道,并通过该队列将 stop/start 消息发送给消息的生成者。这也可以看作是背压的一种实现。
恕我直言,1. 在大多数情况下应该足够了。 2. 如果生成的消息量导致您想要避免的大量资源 (memory/disk) 消耗,则将是必要的。你仍然可以使用两者的组合,例如如果应用程序停机时间超过一段时间,您会通知制作人。
我可以建议以下解决方案。请注意#1、#2 是 "manual",#3 是 "real"。选择取决于您的需要。
- 在使用消息之前检查应用程序可用性。这会工作,但有一个问题:如果应用程序恰好在您使用消息的那一刻变得不可用怎么办?
- 消费消息,尝试将其发送到您的应用程序。如果尝试失败,将消息推回同一个队列。但是要小心这个解决方案:如果你将消息推送到队列,你会立即再次使用它,尝试将它发送到可能仍然不可用的应用程序,再次将它推送到队列等。
- 真正的解决方案是使用事务。这正是您所需要的。如果应用程序不可用,则抛出异常。这将自动启动重试机制。