具有不同消息选择器的多个DefaultMessageListenerContainer实例

时间:2013-08-08 04:20:33

标签: java spring jms activemq

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

经过仔细考虑后,我发现使用多个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的邮件才会被邮件侦听器

捕获

提前谢谢

1 个答案:

答案 0 :(得分:2)

经过数小时的研究和谷歌搜索,发现我正在迭代的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();
    }