Jagadeesh Venkata
Jagadeesh Venkata

Reputation: 270

Multiple DefaultMessageListenerContainer instances with different message selectors

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

Answers (1)

Jagadeesh Venkata
Jagadeesh Venkata

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

Related Questions