【问题标题】:Thread safety with multiple MessageListeners using same onMessage?使用相同 onMessage 的多个 MessageListener 的线程安全?
【发布时间】:2012-10-24 16:55:47
【问题描述】:

如何确保两个 Listener 容器:

<bean id="listenerContainer"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="messageListener" ref="MessageListener" />
    <property name="connectionFactory" ref="tcf" />
    <property name="destinationName" value="${jms-topic}" />
    <property name="pubSubDomain" value="true" />
</bean>

<bean id="listenerContainer-2"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="messageListener" ref="MessageListener" />
    <property name="connectionFactory" ref="tcf" />
    <property name="destinationName" value="${jms-topic-2}" />
    <property name="pubSubDomain" value="true" />
</bean>

<bean id="MessageListener" class="com.my.url.jms.listener.DefaultMessageListener">
    <property name="transformer" ref="transformer" />
    <property name="publisher" ref="publisher" />
</bean>

接收来自不同主题的消息。线程安全吗?

如您所见,它们使用相同的消息侦听器,该消息侦听器也依赖于其他一些 Spring bean。所有消息都会被同一个类中的同一个 onMessage 方法接收到。

public class SomeKlass implements MessageListener {


    public void onMessage(Message message) {        
            //Do some work
    }

}

有人可以建议我解决此类问题的最佳做法吗?来自两个主题的消息需要以相同的方式处理,所以我只需要一个 MessageListener。

谢谢

【问题讨论】:

    标签: java spring jms spring-jms


    【解决方案1】:

    是的,只要您在 SomeKlass 中没有您似乎没有的任何状态,这绝对没问题。

    【讨论】:

    • 谢谢,您能帮我详细说明一下吗?现实中onMessage方法内部有很多处理。为了这个问题,我把它拿出来了。我将编辑并添加更多信息。
    • 共享状态会导致线程问题 - 如果SomeKlass 中存在实例变量,则此变量状态可能已被多个线程修改,并会导致线程安全问题。由于您在 SomeKlass 中没有任何实例变量,因此您的 onMessage 是线程安全的 - 有关相关问题,请参阅 stackoverflow.com/questions/7187943/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多