ActiveMQ単体構成ではuseDatabaseLock=”false”にすること

ActiveMQの61616ポートが開放されない

先日、ActiveMQでフェイルオーバー時にMySQLと連携させる記事を書きましたが、MySQLと連携させるとActiveMQの通信ポート61616がなぜか解放されない問題が起きました。ログを見るとこんな感じ。

2013-07-26 16:54:17,173 | INFO  | Refreshing org.apache.activemq.xbean.XBeanBrokerFactory$1@786c730: startup date [Fri Jul 26 16:54:17 JST 2013]; root of context hierarchy | org.apache.activemq.xbean.XBeanBrokerFactory$1 | WrapperSimpleAppMain
2013-07-26 16:54:18,638 | INFO  | PListStore:[/usr/local/activemq/bin/linux-x86-64/../../data/localhost/tmp_storage] started | org.apache.activemq.store.kahadb.plist.PListStoreImpl | WrapperSimpleAppMain
2013-07-26 16:54:18,682 | INFO  | Using Persistence Adapter: JDBCPersistenceAdapter(org.apache.commons.dbcp.BasicDataSource@6760bf50) | org.apache.activemq.broker.BrokerService | WrapperSimpleAppMain
2013-07-26 16:54:18,972 | INFO  | Database adapter driver override not found for : [mysql_connector_java].  Will use default implementation. | org.apache.activemq.store.jdbc.JDBCPersistenceAdapter | WrapperSimpleAppMain
2013-07-26 16:54:20,070 | INFO  | Database lock driver override not found for : [mysql_connector_java].  Will use default implementation. | org.apache.activemq.store.jdbc.JDBCPersistenceAdapter | WrapperSimpleAppMain
2013-07-26 16:54:20,072 | INFO  | Attempting to acquire the exclusive lock to become the Master broker | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | WrapperSimpleAppMain
2013-07-26 16:54:20,093 | INFO  | Failed to acquire lock.  Sleeping for 10000 milli(s) before trying again... | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | WrapperSimpleAppMain

Database lockに失敗していて、その後スリープされてしまったようです。これでは61616ポートで通信が出来ません。

        <transportConnectors>
            <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireformat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireformat.maxFrameSize=104857600"/>
        </transportConnectors>

上記のようにactivemq.xmlを変更してみたのですが、解決しませんでした。

ActiveMQでMySQLを使用する解決策

どうやら永続化の設定に問題があったようです。activemq.xmlの記述を以下に修正したらMySQLと連携したまま61616ポートで動作するようになりました。

       <persistenceAdapter>
       <jdbcPersistenceAdapter
            dataDirectory="${activemq.base}/data"
            dataSource="#mysql-ds" useDatabaseLock="false" />
       </persistenceAdapter></pre>

lsofでポートを確認しても大丈夫。

lsof -i :61616
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java     8790 tomcat   41u  IPv4  52645      0t0  TCP localhost:46563->localhost:61616 (ESTABLISHED)
java    14588   root  154u  IPv4  52386      0t0  TCP *:61616 (LISTEN)
java    14588   root  157u  IPv4  52646      0t0  TCP localhost:61616->localhost:46563 (ESTABLISHED)

Master / Slave構成でなければuseDatabaseLock=”false”にする必要があるみたいです。