Reputation: 55
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
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?
Upvotes: 0
Views: 99
Reputation: 127
We had a similar if not the same issue after switching from the default database-locker - which is not compatible with Point-in-Time-Recovery (PITR) feature of MS SQL - to alternative lease-database-locker config.
For the lease to be distinguisable the AMQ jdbcPersistenceAdapter locker requires you to add a unique identifier for attribute leaseHolderId. This is not needed for the normal database-locker en thus easily forgotten. We now have:
<persistenceAdapter>
<jdbcPersistenceAdapter createTablesOnStartup="true" dataSource="#sql_ds" adapter="#sql-server-jdbc-adapter" lockKeepAlivePeriod="2000">
<locker>
<lease-database-locker lockAcquireSleepInterval="10000" leaseHolderId="broker1"/>
</locker>
</jdbcPersistenceAdapter>
</persistenceAdapter>
while the second AMQ instance has leaseHolderId="broker2".
The above probably also applies to newer versions of ActiveMQ.
Upvotes: 0