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使ってモニタリングとかその辺も考えなきゃなぁ。。
翔泳社
売り上げランキング: 292025
コメント
[…] TomcatでActiveMQを動かしてみる […]
[…] Check↓ActiveMQを使ってチョコっと動かしてみたことあるのですが TomcatでActiveMQを動かしてみる SpringのJmsTemplateを使ってActiveMQにキューイング とか […]