我有一个要求,我在队列中有可配置数量的消息选择器的消息。我需要平行处理这些消息。
经过仔细考虑后,我发现使用多个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的邮件才会被邮件侦听器
捕获提前谢谢
答案 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();
}