D_J
D_J

Reputation: 55

Apache ActiveMQ Classic 5.12.1 the lease-database-locker does not work properly

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

  1. When I start server1, server1 become the JMS master and same instance entry is added inside ACTIVEMQ_LOCK.
  2. 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?

Upvotes: 0

Views: 99

Answers (1)

Anthony
Anthony

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

Related Questions