TomcatでActiveMQを動かしてみる

RabbitMQを検討していたのですが、フェールオーバー、バックアップ、リストアあたりに不安があって、
文献が英語しかないのはまぁ仕方ないとして、OSSプロダクトなのにErlangなのでソース読んでも
チンプンカンプンで。。(コレはひとえに私がヘッポコなだけですが。。)
 
運用までケツを持つっていう観点だと、極力リスクは無くしておきたくて。
ActiveMQなら、Java、JMSっていう馴染みのあれで、Tomcatっていうコレまた馴染みなあれの
上で動かす事が出来るし、キューイングされたデータも馴染みのMySQLにストアしとくことが出来るので、
これまたナイスかな、と。
 
■ Tomcatのインストール
↓からTomcat7を落としてきます。
http://tomcat.apache.org/download-70.cgi
今回もWindowsでやるのですが、最近マシンが64bitになったので 64-bit Windows zip にしてみます。
zipを解凍するといつもの馴染みのディレクトリ構成です。

C:apache-tomcat-7.0.20>dir /OG
~略~
2011/08/24  10:22    <DIR>          .
2011/08/24  10:22    <DIR>          ..
2011/08/24  10:22    <DIR>          bin
2011/08/24  10:22    <DIR>          conf
2011/08/24  10:22    <DIR>          lib
2011/08/24  10:22    <DIR>          webapps
2011/08/09  09:34    <DIR>          logs
2011/08/24  10:22    <DIR>          temp
2011/08/09  09:34    <DIR>          work
2011/08/24  10:22             1,230 NOTICE
2011/08/24  10:22            57,851 LICENSE
2011/08/24  10:22             6,860 RUNNING.txt
2011/08/24  10:22             9,029 RELEASE-NOTES

さっそくTomcat起動したら環境変数が設定されてなくて怒られました(パソコン新しくするとこういうのあるよねぇ)

C:apache-tomcat-7.0.20bin>startup.bat
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program

んで、無事起動して localhost:8080 にアクセスしたら↓なんかちょっとポップな感じになってますね。

 
■ ActiveMQのインストール
ActiveMQのTomcat用のページ(http://activemq.apache.org/tomcat.html)見ると、
If you are using Tomcat 5.5 or later then try this instead… ってところに、
Contextタグの中にResourceの定義書いておけばOKで後は、
Also, don’t forget to put ActiveMQ and dependent jars to tomcat shared lib directory.って事らしい
んだけど、なんか情報古そうな気がするので、他の記事も探してみると、
↓が良さそうです。去年の12月の記事だし、Tomcatのバージョンも6だし、記述が丁寧でナイスな予感。
http://rocksolutions.wordpress.com/2010/12/03/configure-apache-activemq-with-tomcat-6/
 
バージョンはちと違えど、とりあえず書かれている通りに2つのjarをもってきます。
ActiveMQはhttp://activemq.apache.org/activemq-550-release.htmlから、
最新版っぽい5.5.0を落としてきてたのですが、libディレクトリの中みるとactivemqのjarは
それぞれの機能ごとに分かれていてallってのがなかったので(activemq-jaasとかって何だ?とかw)
↓からダウンロードしてもってきてみます。
http://www.jarvana.com/jarvana/browse/org/apache/activemq/activemq-all/5.5.0/
ちなみに普段Maven使ってる人はpom.xmlに↓書いてればもってきてくれます。

<dependency>
   <groupId>org.apache.activemq</groupId>
   <artifactId>activemq-all</artifactId>
   <version>5.5.0</version>
</dependency>

あとはcommons-loggingを↓から持ってきます。
http://commons.apache.org/logging/download_logging.cgi
ということで、TOMCAT_HOME/libの中は↓のような感じになってます。

C:apache-tomcat-7.0.20lib>dir
~略~
2011/08/24  10:50         4,050,207 activemq-all-5.5.0.jar ★
2011/08/24  10:22            15,261 annotations-api.jar
2011/08/24  10:22            54,684 catalina-ant.jar
2011/08/24  10:22           129,376 catalina-ha.jar
2011/08/24  10:22           253,520 catalina-tribes.jar
2011/08/24  10:22         1,463,613 catalina.jar
2011/08/24  10:53            60,841 commons-logging-1.1.1.jar ★
2011/08/24  10:22         1,708,951 ecj-3.7.jar
2011/08/24  10:22            43,141 el-api.jar
2011/08/24  10:22           122,394 jasper-el.jar
2011/08/24  10:22           589,902 jasper.jar
2011/08/24  10:22            88,690 jsp-api.jar
2011/08/24  10:22           176,839 servlet-api.jar
2011/08/24  10:22             6,869 tomcat-api.jar
2011/08/24  10:22           742,146 tomcat-coyote.jar
2011/08/24  10:22           235,173 tomcat-dbcp.jar
2011/08/24  10:22            76,688 tomcat-i18n-es.jar
2011/08/24  10:22            48,699 tomcat-i18n-fr.jar
2011/08/24  10:22            52,148 tomcat-i18n-ja.jar
2011/08/24  10:22           115,696 tomcat-jdbc.jar
2011/08/24  10:22            23,047 tomcat-util.jar

 
続いて、server.xmlに以下の記載を追加します。
#今のところ複数のところにバラまく予定ないけど、パブリシャとサブスクライバな
#あれなんすかね、topicとかqueueとか。

	<Resource name="jms/ConnectionFactory" auth="Container"
              type="org.apache.activemq.ActiveMQConnectionFactory"
              description="JMS Connection Factory"
              factory="org.apache.activemq.jndi.JNDIReferenceFactory"
              brokerURL="tcp://localhost:61616"
              brokerName="ActiveMQBroker"
              useEmbeddedBroker="false"/>

	<Resource name="jms/topic/MyTopic" auth="Container"
              type="org.apache.activemq.command.ActiveMQTopic"
              factory="org.apache.activemq.jndi.JNDIReferenceFactory"
              physicalName="APP.JMS.TOPIC"/>

	<Resource name="jms/queue/MyQueue" auth="Container"
              type="org.apache.activemq.command.ActiveMQQueue"
              factory="org.apache.activemq.jndi.JNDIReferenceFactory"
              physicalName="APP.JMS.QUEUE" />

 
でもってcontext.xmlです。意味合い的には上で定義したリソースにWebアプリから参照とか、
そんな感じですかね。

    <ResourceLink global="jms/ConnectionFactory" name="jms/ConnectionFactory" type="javax.jms.ConnectionFactory"/>
    <ResourceLink global="jms/topic/MyTopic" name="jms/topic/MyTopic" type="javax.jms.Topic"/>
    <ResourceLink global="jms/queue/MyQueue" name="jms/queue/MyQueue" type="javax.jms.Queue"/>

とりあえず再起動してみると、slf4jが無い的な事行ってます。。

Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
        ... 38 more

とりあえずlibディレクトリに slf4j-api-1.5.11.jar と slf4j-simple-1.5.11.jar を lib に突っ込んで再起動させたら、
それっぽく起動した模様です。
 
んでもって、setenv.batを作ってjavaのオプションに↓を追加しするとJMX使って何やら便利とか
そんな感じっぽいのですが、またjar追加してどうの的な感じだったり、普段の監視の仕掛けとかがあるので、
一旦おいておきます。

set JAVA_OPTS=-Dwebconsole.type=properties 
-Dwebconsole.jms.url=tcp://localhost:61616 
-Dwebconsole.jmx.url=service:jmx:rmi:///jndi/rmi://localhost:1099/ jmxrmi

 
■ ActiveMQにアクセス
パブリシャ用のサーブレットを作れとか書いてあったのですが、
パブリシャはこのTomcatのプロセスから独立させたいので別に普通にJava書きます。
 
というか 1.JMSの基礎 ていう↓の記事がナイスだったのでそのプログラムを借用的な…w
(http://www.techscore.com/tech/Java/JavaEE/JMS/1/)
#import先が org.activemq から org.apache.activemq に変わってるみたいですね。
 
で、実行してみると、、ウンともスンとも言わねぇ。。。
ってかSenderでcreateQueueSessionするところでピタっと止まってしまってます、と。
 
で、デフォルトの61616ポートがリスンしてるかnetstat叩いてみると、いやしませんと。。
 
ってことで、you can also add one jsp which will initialize the BrokerService on App start.
とかって書いてあるので、以下のJSPを追加してTomcat起動してから叩きます。

<%@ page import="org.apache.activemq.broker.BrokerService" %>
<%
BrokerService broker = new BrokerService();
// configure the broker
broker.addConnector("tcp://localhost:61616");
broker.start();
%>
Hello World!

 
で、Hello Worldして、↓でリスンしてるのを確かめてたら、

  TCP    127.0.0.1:61616        0.0.0.0:0              LISTENING

↓のようなログが出てきて、、なんとなく良さげです。KahaDBってなんじゃらホイ?とかは置いておいて。。

5566 [JMX connector] INFO org.apache.activemq.broker.jmx.ManagementContext - JMX consoles can connect to service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi
5602 [http-apr-8080-exec-2] INFO org.apache.activemq.store.kahadb.plist.PListStore - PListStore:activemq-datalocalhosttmp_storage started
5604 [http-apr-8080-exec-2] INFO org.apache.activemq.broker.BrokerService - Using Persistence Adapter:KahaDBPersistenceAdapter[C:apache-tomcat-7.0.20binactivemq-datalocalhostKahaDB]
5899 [http-apr-8080-exec-2] INFO org.apache.activemq.store.kahadb.MessageDatabase - KahaDB is version 3
5912 [http-apr-8080-exec-2] INFO org.apache.activemq.store.kahadb.MessageDatabase - Recovering fromthe journal ...
5913 [http-apr-8080-exec-2] INFO org.apache.activemq.store.kahadb.MessageDatabase - Recovery replayed 2 operations from the journal in 0.0090 seconds.
5918 [http-apr-8080-exec-2] INFO org.apache.activemq.broker.BrokerService - ActiveMQ 5.5.0 JMS Message Broker (localhost) is starting
5918 [http-apr-8080-exec-2] INFO org.apache.activemq.broker.BrokerService - For help or more information please see: http://activemq.apache.org/
6064 [http-apr-8080-exec-2] INFO org.apache.activemq.transport.TransportServerThreadSupport - Listening for connections at: tcp://127.0.0.1:61616
6064 [http-apr-8080-exec-2] INFO org.apache.activemq.broker.TransportConnector - Connector tcp://127.0.0.1:61616 Started
6066 [http-apr-8080-exec-2] INFO org.apache.activemq.broker.BrokerService - ActiveMQ JMS Message Broker (localhost, ID:P16549-61665-1314161253504-0:1) started

 
Sender叩くと↓のような良さげなメッセージが出て

195 [ActiveMQ Task-1] INFO org.apache.activemq.transport.failover.FailoverTransport - Successfully connected to tcp://localhost:61616

 
Receiver叩くと↓でちゃんと値が取得できます。

This is Message!!

 

おいおいSpringのTemplate使って~って感じで。。http://static.springsource.org/spring/docs/2.5.x/reference/jms.html
JMX使ってモニタリングとかその辺も考えなきゃなぁ。。
 

マスタリングJavaEE5 第2版 (DVD付) (Programmer’s SELECTION)
三菱UFJインフォメーションテクノロジー株式会社 斉藤 賢哉
翔泳社
売り上げランキング: 292025

コメント

  1. […] TomcatでActiveMQを動かしてみる […]

  2. […] Check↓ActiveMQを使ってチョコっと動かしてみたことあるのですが TomcatでActiveMQを動かしてみる SpringのJmsTemplateを使ってActiveMQにキューイング とか […]

タイトルとURLをコピーしました