【问题标题】:Spring's JMS Design Question : Decouple processing of messagesSpring 的 JMS 设计问题:消息的解耦处理
【发布时间】:2010-04-13 02:06:14
【问题描述】:

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

谢谢,

【问题讨论】:

    标签: spring jms


    【解决方案1】:

    我认为您实际上可能想从您的 onMessage 调用 Web 服务。为什么要快速出列消息,然后延迟进一步处理?如果你按照你所说的去做,你可能不得不引入另一个级别的队列,或者某种临时的“持有”集合,这是多余的。队列的重点是保存消息,您的消息侦听器会将它们拉出并尽快处理它们。

    如果您正在寻找一种最大化队列吞吐量的方法,您可能会考虑将其设为多线程,以便让多个线程从队列中拉出消息以调用 Web 服务。您可以通过在 DefaultMessageListenerContainer 上设置“concurrentConsumers”配置轻松地做到这一点。如果将 concurrentConsumers 设置为 5,您将有 5 个线程将消息从队列中拉出以进行处理。如果您必须保持消息的顺序,这确实会变得很棘手,但如果是这种情况,可能会有解决该问题的方法。

    【讨论】:

      【解决方案2】:

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

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

      如果在 web 服务调用期间发生错误,我们将其作为单独的 Message 广播到 GUI,存在跨消息保留的请求 ID 的概念,以便 GUI 可以关联错误消息。您可以使用 ExecutorService 实现来提交任务。

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2012-10-09
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多