Reputation: 270
I have a requirement where i have messages in a queue with configurable number of message selectors. Where I need to process those messages parallely.
After careful consideration I came to a point where using multiple DefaultMessageListenerContainers will yield good results.
so I configured everything
<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>
and creating DefaultMessageListenerContainers on the fly
for (String selector : messageSelectors.getSelectors()) {
parallelProcess.setMessageSelector("Message" + " = '" + selector + "'");
parallelProcess.start();
}
the problem is, if I have 3 selectors it is creating DefaultMessageListenerContainer for only the last one. i.e., if selectors={"TYPE1", "TYPE3", "TYPE3"}
only messages with TYPE3 are caught in message listener
Thank you in advance
Upvotes: 0
Views: 1970
Reputation: 270
After hours of researching and googling, found out that the foreach loop i am iterating is setting the same parallelProcess so it end up setting TYPE3
so the solution is to create a new bean every time you loop...
here is the solution
<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();
}
Upvotes: 2