1

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

经过仔细考虑,我发现使用多个 DefaultMessageListenerContainers 将产生良好的结果。

所以我配置了一切

<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 的消息被消息监听器捕获

先感谢您

4

1 回答 1

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();
    }
于 2013-08-08T05:20:48.543 回答