Hi all,

I have some concerns about the configuration of my spring application. 
I have 2 brokers (one main and one failover) and I want my client to produce
messages to the first broker. It should go to the second one just in case
the first broker is down, and automatically go back to the first broker when
it's up again.
My client also consumes these messages and I'd like *the consumers to be
constantly connected to both brokers* so that I can ensure no message is
left on a broker.

*ActiveMQ 5.14.1* is used for the brokers
My client is a Java web application using *spring 4.0.1.RELEASE,
activemq-all 5.11.0* and running on tomcat 7. It must be able to process
several messages (~10) by second.

For my producers, I use this JNDI resource to build the connection factory:
<Resource auth="Container" brokerName="broker"
brokerURL="failover:(tcp://broker1,tcp://broker2)?randomize=false&amp;timeout=1000"
factory="org.apache.activemq.jndi.JNDIReferenceFactory" initialSize="10"
name="activemq.connectionFactory"
type="org.apache.activemq.ActiveMQConnectionFactory"/>
        
And here are the Spring beans:
<bean id="jmsFactory"
class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop" >
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
        <property name="useAnonymousProducers" value="false"/>
        <property name="blockIfSessionPoolIsFullTimeout" 
value="5000"></property>
        <property name="idleTimeout" value="300000"></property>
</bean>

<bean id="myProducer" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsFactory" />
        <property name="defaultDestination" ref="myQueue" />
        <property name="sessionTransacted" value="false" />
        <property name="deliveryMode" value="1"/>
        <property name="explicitQosEnabled" value="true"/>
</bean>

For the consumers, I can't find the appropriate way to connect to both
brokers so I duplicated my configuration like below but it doesn't look
right:
I have 2 JNDI resources:
<Resource auth="Container" brokerName="broker1" brokerURL="tcp://broker1"
factory="org.apache.activemq.jndi.JNDIReferenceFactory" initialSize="10"
name="activemq.consumer.main.connectionFactory"
type="org.apache.activemq.ActiveMQConnectionFactory"/>        
<Resource auth="Container" brokerName="broker2" brokerURL="tcp://broker2"
factory="org.apache.activemq.jndi.JNDIReferenceFactory" initialSize="10"
name="activemq.consumer.failover.connectionFactory"
type="org.apache.activemq.ActiveMQConnectionFactory"/>

And here are the spring beans:
<jee:jndi-lookup resource-ref="true" id="jmsMainConsumerConnectionFactory"
jndi-name="activemq.consumer.main.connectionFactory"
proxy-interface="javax.jms.ConnectionFactory" lookup-on-startup="true"/>
<jee:jndi-lookup resource-ref="true"
id="jmsFailoverConsumerConnectionFactory"
jndi-name="activemq.consumer.failover.connectionFactory"
proxy-interface="javax.jms.ConnectionFactory" lookup-on-startup="true"/>

<bean id="jmsMainConsumerFactory"
class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop" >
        <property name="connectionFactory" 
ref="jmsMainConsumerConnectionFactory"
/>
        <property name="maxConnections" value="2" />
        <property name="idleTimeout" value="300000" />
</bean>
<bean id="jmsFailoverConsumerFactory"
class="org.apache.activemq.pool.PooledConnectionFactory"
destroy-method="stop" >
        <property name="connectionFactory"
ref="jmsFailoverConsumerConnectionFactory"/>
        <property name="maxConnections" value="2" />
        <property name="idleTimeout" value="300000" />
</bean>

<bean id="jmsMainListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"
destroy-method="shutdown">
        <property name="connectionFactory" ref="jmsMainConsumerFactory" />
        <property name="messageListener" ref="myMessageListener"/>
        <property name="destination" ref="myQueue" />
        <property name="maxConcurrentConsumers" value="30" />
        <property name="concurrentConsumers" value="20"/>
        <property name="sessionTransacted" value="false" />
        <property name="exposeListenerSession" value="true" />
        <property name="cacheLevelName" value="CACHE_CONSUMER" />
</bean>
<bean id="jmsFailoverListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"
destroy-method="shutdown">
        <property name="connectionFactory" ref="jmsFailoverConsumerFactory" />
        <property name="messageListener" ref="myMessageListener"/>
        <property name="destination" ref="myQueue" />
        <property name="maxConcurrentConsumers" value="30" />
        <property name="concurrentConsumers" value="20"/>
        <property name="sessionTransacted" value="false" />
        <property name="exposeListenerSession" value="true" />
        <property name="cacheLevelName" value="CACHE_CONSUMER" />
</bean>

It doesn't make sense to duplicate these above consumers configurations so
could you please help me find the right way to implement my use case?
Also, if you have any other recommendation, I'd really appreciate.

Thanks.



--
Sent from: http://activemq.2283324.n4.nabble.com/ActiveMQ-User-f2341805.html

Reply via email to