I am using ActiveMQ Classic shared database strategy to ensure high availability. config:
<amq:broker useJmx="false" persistent="true" startAsync="true" brokerName="${server.instance.name}" useShutdownHook="false">
<amq:persistenceAdapter>
<amq:jdbcPersistenceAdapter dataSource="#dataSource" lockKeepAlivePeriod="5000">
<amq:databaseLocker>
<amq:lease-database-locker lockAcquireSleepInterval="10000" ></amq:lease-database-locker>
</amq:databaseLocker>
<amq:statements>
<amq:statements lockCreateStatement="SELECT * FROM ACTIVEMQ_LOCK WHERE ID = 1 FOR UPDATE WAIT 0" />
</amq:statements>
</amq:jdbcPersistenceAdapter>
</amq:persistenceAdapter>
<amq:connectionFactory id="connectionFactory"
brokerURL="${jms.url}" userName="${jms.user}" password="${jms.password}">
<property name="redeliveryPolicy" ref="redeliveryPolicy" />
</amq:connectionFactory>
<!-- Other Bean Configs -->
<amq:transportConnectors/>
<amq:destinationPolicy/>
<bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy"/>
</beans>
Issue: I am using 2 server architecture where
- When I start server1, server1 become the JMS master and same instance entry is added inside ACTIVEMQ_LOCK.
- Now server1 is running, and I started server2 the JMS master is transfer to server2, and now ACTIVEMQ_LOCK will have entry for the server2 instance.
Ideally, the Master transfer should happen only if server1(master) is down/unavailable. Could you please share thoughts if I am missing something in the configurations?