Spring和JMS。每个客户端应用程序的单独队列。这是正确的做法吗?

时间:2016-05-26 17:52:38

标签: spring architecture activemq message-queue

我需要设计客户端请求的容错处理。每个请求都通过单独的消息传递给多个系统。即使其中一个系统现在还没有工作,请求必须处理到发送到该系统的点,此时它必须等待恢复系统大约一天。在一天的系统不可用请求进入特殊手动过程之后。特殊应用程序负责消息路由。此应用程序也只是消息代理生产者和消费者。消息代理用于消息的持久性和重新传递策略。

我的想法是每个客户端请求进程都应该在消息代理中使用自己的队列。因此,特定请求发生的情况并不重要 - 其他请求将单独处理。我遇到了动态服务消息监听器的问题。当我使用Spring时,我需要动态创建DefaultMessageListenerContainer作为spring bean。我可以处理这件事。但是下一个问题是,当特定客户端请求完全完成且消息代理中的队列为空时,我需要使用侦听器销毁DefaultMessageListenerContainer。我在请求完成时没有任何通知,或者由于一段时间不活动而在消息代理中自动销毁队列。我只看到一种方法 - 创建特殊任务,轮询消息代理以获取活动队列,并在其目标被删除时销毁DefaultMessageListenerContainer

我认为这在逻辑上是正确的,因为我需要队列来处理客户端请求,但我不需要客户端请求队列。但这个解决方案太复杂了。每个具体系统队列的简单解决方案似乎在逻辑上是错误的。但这很容易。

有人可以就这种情况给我建议吗?我觉得我错了,但是我无法理解错误的确切位置。

我的技术是:Java,Spring,ActiveMQ。

1 个答案:

答案 0 :(得分:0)

您可以使用RabbitMQ或类似的东西吗?如果是这样,您可以为每个系统创建一个队列,以便在那里对客户端请求进行排队。如果系统出现问题,其队列只会累积所有请求。当服务恢复工作时,它将继续从队列中弹出消息并处理它们。

要将请求发送到手动处理,您可以创建一个单独的进程,该进程将查看每个队列并检查消息的日期而不将其从队列中删除。如果它们已经过时,它应该将它们从队列中弹出并转移到manual-processing队列或其他任何位置。