ActiveMQのインストールと使い方とQueueとTopicの違いについて

スポンサーリンク

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にアクセスすると管理画面が表示されます。

f:id:tasukujp:20150704172516p:plain

Manage ActiveMQ broker をクリックすると認証を求められますので「admin/admin」と入力すると次の画面に遷移します。

f:id:tasukujp:20150704173852p:plain

 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 に入った回数ですね。

f:id:tasukujp:20150704195503p:plain

続いて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 にメッセージが入ってくるまで待機状態になります。

f:id:tasukujp:20150704195845p:plain

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(消費者)が一人もいない事を指しています。

f:id:tasukujp:20150704202909p:plain

それでは Subscriber(購読)してみたいと思います。しかし、ここでジョブが止まってしまいますね。

# java -cp /usr/local/activemq.jar com.tasknotes.mq.ReceiverTopic

もう一度管理画面を見てみると、Subscriber(購読)したので Consumers(消費者)は 1 に増えていますが、Message Dequeued は 0 のままです。なぜかというと、メッセージを送信した段階で Consumers(消費者)が居なければメッセージを取得する事はできないのです。

f:id:tasukujp:20150704205000p:plain

それでは止まっている Receiver をそのままにして、別のターミナルを開いてから Sender を実行して Publisher(出版社)からメッセージを送信してみましょう。止まってたジョブが終了して「Hello Message!」と表示されたはずです。

# java -cp /usr/local/activemq.jar com.tasknotes.mq.SenderTopic

Consumers(消費者)が 0 に戻り、Message Enqueued と Message Dequeued が 1 ずつカウントアップされました。

f:id:tasukujp:20150704205814p:plain

以上のことから、特定の Topic(話題)に対して Subscriber(購読)をしておく必要があるため、Pub/Subモデルの場合は先に受信側を起動する必要があります。