【问题标题】:MDB bean pool vs Spring JMS concurrent consumersMDB bean 池与 Spring JMS 并发消费者
【发布时间】:2014-09-06 06:52:59
【问题描述】:

我来自 EJB 背景,从事用于异步消息处理的 MDB。最近我被转移到一个使用 Spring 消息传递的项目。作为 Spring JMS 侦听器的新手,在将并发语义与 MDB 进行比较时,我有点困惑。

MDB - 据我了解,我们不需要担心线程安全,它维护一个 MDB bean 池(池大小是我们可以配置的)。每当有新消息到达目的地(队列)时。 EJB Container 从池中挑选一个实例并处理消息。

Spring - 我不确定我是否完全理解它。我们在容器内定义了一个监听器类。我不知道它是否会使用侦听器类的新实例处理每个传入的消息,还是会创建一个新线程(就像我们在 servlet 中一样)?另一个让我感到困惑的是可配置参数 concurrentConsumers ,它类似于我们在 EJB 容器中的 bean 池吗?

【问题讨论】:

    标签: spring thread-safety ejb-3.0 messaging spring-jms


    【解决方案1】:

    应用了 Spring 语义,因此在典型情况下,您的侦听器 bean 是一个单例,您必须自己保证线程安全。当然这是微不足道的:如果你有这个

    public class MDB implements MessageListener {
        public void onMessage(Message inMessage) {
            ...blablabla...
        }
    }
    

    现在你基本上可以:

    public class SpringMessageListener implements MessageListener {
        public void onMessage(Message inMessage) {
            MDB mdb = new MDB(...parameters MDB might need...);
            mdb.onMessage(inMessage);
        }   
    }
    

    【讨论】:

    • 感谢您的快速回复。正如你所说,它是一个单例,concurrentconsumers 设置怎么样,如果我说它是 5 。它不会创建五个 listener 实例吗?它与我们在 MDB 中的池大小不一样吗?
    • 没有。假设您正在使用DefaultMessageListenerContainer(或朋友的 DMLC)和一个单例侦听器,它将创建 5 个 侦听器容器任务,这些任务将尝试使用 同一个侦听器来使用消息。这就是为什么我写了如何轻松地从MDBs“转换”为 Spring 侦听器的原因。最后一点,请注意“侦听器容器任务”不一定表示“并发线程”。
    • 谢谢gpeche ..我明白你的意思了,所以这与我们在EJB容器中的不同......我们必须自己确保线程安全,以防spring消息传递.. ......虽然,我没有得到你的最后一点“监听器容器任务”与线程的区别......而且这个并发容器任务(或线程)将确保,现在我的监听器可以并行处理 5 条消息。我说的对吗?
    • Spring 会通过某种机制(通常是一些线程池)来调度那些监听容器任务。如果该线程池配置了 3 个线程,那么您将有有效最多 3 个并发消费者,而其他两个保持排队。
    • 作为一般规则,在 Java EE 世界中,您有容器创建 bean 和/或排队请求以确保一切都是线程安全的,因此开发人员不必担心这一点。相比之下,当你使用 Spring 时,大多数东西通常都是单例的,所以你必须关心线程安全。
    猜你喜欢
    • 2011-08-05
    • 1970-01-01
    • 2016-02-11
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2012-01-28
    相关资源
    最近更新 更多