【问题标题】:Multiple DefaultMessageListenerContainer instances with different message selectors具有不同消息选择器的多个 DefaultMessageListenerContainer 实例
【发布时间】:2013-08-08 13:20:48
【问题描述】:

我有一个要求,我的队列中有消息,消息选择器的数量是可配置的。我需要在哪里并行处理这些消息。

经过仔细考虑,我发现使用多个 DefaultMessageListenerContainer 会产生良好的效果。

所以我配置了一切

<bean id="parallelProcess"
      class="org.springframework.jms.listener.DefaultMessageListenerContainer"  scope="prototype">
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
    <property name="autoStartup" value="false"/>
    <property name="destinationName" value="parallel.process.queue"/>
    <property name="messageListener" ref="messageProcessor"/>
</bean>

并动态创建 DefaultMessageListenerContainers

for (String selector : messageSelectors.getSelectors()) {
        parallelProcess.setMessageSelector("Message" + " = '" + selector + "'");
        parallelProcess.start();
    }

问题是,如果我有 3 个选择器,它只会为最后一个选择器创建 DefaultMessageListenerContainer。即,如果选择器={"TYPE1", "TYPE3", "TYPE3"}

只有 TYPE3 的消息才会被消息监听器捕获

提前谢谢你

【问题讨论】:

    标签: java spring jms activemq


    【解决方案1】:

    经过数小时的研究和谷歌搜索,发现我正在迭代的 foreach 循环正在设置相同的 parallelProcess,因此它最终设置为 TYPE3

    所以解决方案是每次循环时创建一个新 bean...

    这里有解决办法

    <bean id="myBeanFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
        <property name="targetBeanName">
            <idref local="parallelProcess"/>
        </property>
    </bean>
    
     for (String selector : messageSelectors.getSelectors()) {
            DefaultMessageListenerContainer parallelProcess= myBeanFactory.getObject();
            parallelProcess.setMessageSelector(QueueDecisionProcessor.MESSAGE_CATEGORY + " = '" + selector + "'");
            parallelProcess.start();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2018-07-25
      • 1970-01-01
      • 2015-10-17
      相关资源
      最近更新 更多