【问题标题】:How to create thread safe MessageListeners in DefaultMessageListenerContainer如何在 DefaultMessageListenerContainer 中创建线程安全的 MessageListener
【发布时间】:2014-11-12 12:57:33
【问题描述】:

我的 MessageListener 实现不是线程安全的。

当我尝试在 DefaultMessageListenerContainer 中将它与多个消费者连接时,这会导致问题,因为所有消费者共享相同的 MessageListener 对象。

有没有办法通过让 DefaultMessageListener 容器创建多个 MessageListeners 实例来解决这个问题,这样,MessageListener 就不会在消费者线程之间共享。

这样每个消费者线程都会有自己的 MessageListener 实例。

请指教。

【问题讨论】:

    标签: spring-integration spring-jms


    【解决方案1】:

    没有内置任何东西来支持这一点。使服务无状态(因此是线程安全的)通常被认为是最佳实践。

    如果这不可能,您需要创建一个包装监听器;两种简单的方法是将侦听器的实例存储在ThreadLocal 中,或者维护一个对象池并在每条消息的池中检索/返回实例。

    【讨论】:

    • 谢谢加里。很抱歉将我的问题改为弹簧集成。但是刚刚发现我的要求实际上可能与我所要求的不同。我们使用 Spring 集成。因此,DMLC 实际上是分配给 MessageDrivenChannelAdapter。在 MessageDrivenChannelAdapter 之后,消息被发送到服务激活器。那么,我应该为服务激活器实例创建线程本地实例吗?在这种情况下,我可以将 ThreadLocalTargetSource 用于 ServiceActivator 实例吗?正如许多博客所说,如果我们使用它,我们会面临任何内存问题吗?
    • 不是服务激活器,而是它引用的 bean - 为它创建一个包装器。我会使用池而不是ThreadLocal。当然,最好的解决方案是让你的服务 bean 无状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多