ActiveMQのインストールから実際にプログラムで動かしてみる使い方まで基本的な部分をまとめました。QueueとTopicの違いも重要です。ActiveMQは日本語のドキュメントが少なく、本も英語版しかないので最初は苦労した覚えがありますが、なんで日本語の本出ないんでしょうね。
ActiveMQのインストール
ActiveMQはJavaで実装されているため、先にJavaのインストールをします。 CentOSにJava(JDK)をRPMでインストール+バージョン変更について - TASK NOTES
Apache ActiveMQ ™ のDownloadページからバージョンを選択します。今回は最新の安定版である 5.11.1 にしました。ダウンロードしたら解凍して任意のディレクトリに移動させて下さい。名前が長いのでシンボリックリンクも作成しておきました。
# wget http://ftp.riken.jp/net/apache/activemq/5.11.1/apache-activemq-5.11.1-bin.tar.gz # tar zxvf apache-activemq-5.11.1-bin.tar.gz # mv apache-activemq-5.11.1 /usr/local/ # ln -s /usr/local/apache-activemq-5.11.1/ /usr/local/activemq
ActiveMQの起動
起動するには解凍したディレクトリ内にあるbin/activemq
を実行します。
# /usr/local/activemq/bin/activemq start INFO: Loading '/usr/local/apache-activemq-5.11.1/bin/env' INFO: Using java '/usr/java/default/bin/java' INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details INFO: pidfile created : '/usr/local/apache-activemq-5.11.1/data/activemq.pid' (pid '25662')
起動したらブラウザでhttp://<IPアドレス>:8161
にアクセスすると管理画面が表示されます。
Manage ActiveMQ broker をクリックすると認証を求められますので「admin/admin」と入力すると次の画面に遷移します。
Apache ActiveMQ ™ -- Getting Started
メッセージの送受信プログラム作成
ActiveMQには Queue と Topic という2つのメッセージ送信先があるので、2種類の Sender と Receiver を作成します。Queue と Topic の違いについては実際に試しながら確認しますが Apache ActiveMQ ™ -- How does a Queue compare to a Topic にも書かれていますので目を通してみて下さい。
サンプルプログラムの作成はGradleを使用します。Javaプロジェクトの作り方については Gradleで始めるJavaプロジェクトとEclipseのプラグイン を参考にしてください。
Queueの送信プログラム
Queueの受信プログラム
Topicの送信プログラム
Topicの受信プログラム
build.gradle
プロジェクトのビルド
プログラムが完成したらビルドします。ジョブの実行には作成された jar を使用して下さい。
# gradle fatJar # cp build/libs/activemq.jar /usr/local/
Queue(Point-To-Point)
Point-To-Point は PTP と略され、送信者と受信者が一対一でメッセージをやりとりするモデルです。
まずはSenderを実行して Queue にメッセージを送信します。
# java -cp /usr/local/activemq.jar com.tasknotes.mq.SenderQueue
管理画面の Queues を確認すると queue_test という Queue が作成されて、Number Of Pending~ が 1 に、Messages Enqueued が 1 になっているのがわかります。前者が Queue に残ってるメッセージ数、後者がメッセージが Queue に入った回数ですね。
続いてReceiverを実行するとメッセージが取得できます。
# java -cp /usr/local/activemq.jar com.tasknotes.mq.ReceiverQueue Hello Message!
Queue の状態は Number Of Pending が 0 に、Message Dequeued が 1 に変わりました。Receiverで取得できるメッセージは1個ずつです。Queue に入ってるメッセージが無い状態で Receiver を実行すると Queue にメッセージが入ってくるまで待機状態になります。
Topic(Publisher-Subscriber)
Publisher-Subscriber は Pub/Sub と略され、送信者と受信者が一対多でメッセージをやりとりするモデルです。
最初は中々理解出来なかったのですが、使われてる単語の意味を交えて考えるとすごい分かり易かったのでまとめてみると次のようになります。
「作成された Topic(話題)に対して受信側の Consumers(消費者)が Subscriber(購読)しておくことで、送信側の Publisher(出版社)がメッセージを送信すると、Subscriber(購読)している全ての受信者にメッセージが送信される」
という意味になります。ルー大柴みたいになってしまいました。
実際に順を追って確認してみましょう。
Senderを実行して Topic にメッセージを送信します。
# java -cp /usr/local/activemq.jar com.tasknotes.mq.SenderTopic
管理画面の Topics を確認すると topic_test という Topic が作成されて Message Enqueued が 1 になっています。ただし、Number Of Consumers も 0 になっていると思います。これは Subscriber(購読)している Consumers(消費者)が一人もいない事を指しています。
それでは Subscriber(購読)してみたいと思います。しかし、ここでジョブが止まってしまいますね。
# java -cp /usr/local/activemq.jar com.tasknotes.mq.ReceiverTopic
もう一度管理画面を見てみると、Subscriber(購読)したので Consumers(消費者)は 1 に増えていますが、Message Dequeued は 0 のままです。なぜかというと、メッセージを送信した段階で Consumers(消費者)が居なければメッセージを取得する事はできないのです。
それでは止まっている Receiver をそのままにして、別のターミナルを開いてから Sender を実行して Publisher(出版社)からメッセージを送信してみましょう。止まってたジョブが終了して「Hello Message!」と表示されたはずです。
# java -cp /usr/local/activemq.jar com.tasknotes.mq.SenderTopic
Consumers(消費者)が 0 に戻り、Message Enqueued と Message Dequeued が 1 ずつカウントアップされました。
以上のことから、特定の Topic(話題)に対して Subscriber(購読)をしておく必要があるため、Pub/Subモデルの場合は先に受信側を起動する必要があります。