Spring 弹簧&x27;s JMS设计问题:消息的解耦处理

Spring 弹簧&x27;s JMS设计问题:消息的解耦处理,spring,jms,Spring,Jms,我使用消息侦听器来处理来自MQ的一些消息,这些消息基于Spring的DefaultMessageListenerContainer。收到消息后,我必须进行Web服务(WS)调用。但是,我不想在onMessage方法中执行此操作,因为它会阻止onMessage方法,直到WS调用成功,这会在队列中的消息退出队列时引入延迟。我如何通过在onMesage方法之外调用Web服务或在不影响消息排队的情况下调用它来解耦Web服务的调用 谢谢,我想您可能真的想从onMessage调用web服务。为什么要快速将消

我使用消息侦听器来处理来自MQ的一些消息,这些消息基于Spring的DefaultMessageListenerContainer。收到消息后,我必须进行Web服务(WS)调用。但是,我不想在onMessage方法中执行此操作,因为它会阻止onMessage方法,直到WS调用成功,这会在队列中的消息退出队列时引入延迟。我如何通过在onMesage方法之外调用Web服务或在不影响消息排队的情况下调用它来解耦Web服务的调用


谢谢,

我想您可能真的想从onMessage调用web服务。为什么要快速将消息出列,然后延迟进一步的处理?如果你按照你说的去做,你可能需要引入另一个级别的排队,或者某种临时的“保留”集合,这是多余的。队列的目的是保存消息,而您的消息侦听器将尽可能快地提取并处理它们


如果您正在寻找一种最大化队列吞吐量的方法,您可能会考虑将其设置为多线程,这样您就有多个线程从队列中提取消息来调用web服务。您可以通过在DefaultMessageListenerContainer上设置“concurrentConsumers”配置来轻松实现这一点。如果将concurrentConsumers设置为5,将有5个线程从队列中提取消息进行处理。如果您必须保持消息的顺序,这确实会很棘手,但如果是这样的话,这个问题可能会有解决方案。

我同意前面提供的答案,但是我可以看到一个类似的用例在实践中非常常见。我加上我的两分钱,在某些情况下,您可能不想在onMessage线程中执行耗时的工作(这是从Q中提取消息)

我们在一个工作流中也有类似的功能,如果用户在GUI上选择某个XYZ选项,这意味着在服务器上,我们需要连接到另一个外部Web服务以获取ABCD。在这种情况下,我们不在onMessage Thread中调用Web服务,而是使用ThreadPool来调度和处理该调用

如果在webservice调用过程中发生错误,我们将其作为单独的消息广播给GUI,则在消息之间保留请求id的概念,以便GUI可以关联错误消息。您可以使用ExecutorService实现提交任务

希望能有帮助