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”にする必要があるみたいです。