Active MQをUbuntuにインストールして動かしてみる

仕事で使う予定のアプリケーションがメッセージングサービスを使っているらしく、
そういえばJMSって名前を聞くわりに実物を動かしたことないなと思い、
簡単に動かしてみることにした。

とりあえずどんな感じか試してみたいだけなので、
なるべく簡単に手抜きの形で動かしてみる。

本家サイトの[Getting Started](http://activemq.apache.org/getting-started.html)を見ながらインストールを試みることにした。

## 環境
OS: Ubuntu 16.04.3 LTS \n \l
openjdk: "1.8.0_151"
Active MQ: Apache ActiveMQ 5.15.2 

## 前提条件を確認

ソースからコンパイルするわけでなければ　JRE1.7とJAVA_HOMEの設定で十分らしい。
JRE1.7 ?? と思ったが、ActiveMQの[ダウンロードページ](http://activemq.apache.org/activemq-5152-release.html)をみたらJava8以上にしろとあった。


とりあえず現環境のJavaを確認

```shell-session
# java -version
openjdk version "1.8.0_151"
OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.16.04.2-b12)
OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)
```

### Active MQをダウンロードできるようにwgetコマンドをインストールしておく

```shell-session
# apt-get install wget -y
```

## Active MQをダウンロードして展開

```shell-session

# cd /opt

# wget -O apache-activemq-5.15.2-bin.tar.gz "http://www.apache.org/dyn/closer.cgi?filename=/activemq/5.15.2/apache-activemq-5.15.2-bin.tar.gz&action=download"
# tar zxf apache-activemq-5.15.2-bin.tar.gz
# rm apache-activemq-5.15.2-bin.tar.gz

# #シンボリックリンクを貼る
# ln -s /opt/apache-activemq-5.15.2 activemq
```

## Active MQの起動

```shell-session
# /opt/activemq/bin/activemq start
```
## ブラウザからアクセス

URL: http://localhost:8161/admin/
Login: admin
Passwort: admin

※ localhost部分はサーバーのホスト名

## Queueを作成する

ナビゲーションのところのQueueをクリックしてQueueを登録する

![login.png](https://qiita-image-store.s3.amazonaws.com/0/215058/b472114b-5722-e0e1-3bd6-063900e5dd9f.png)

![Screen Shot 2017-12-03 at 1.44.40.png](https://qiita-image-store.s3.amazonaws.com/0/215058/ddb705de-0a7e-2bc8-127a-3753a8a9afb1.png)

![Screen Shot 2017-12-03 at 1.44.50.png](https://qiita-image-store.s3.amazonaws.com/0/215058/7f167e05-5376-85a2-29b2-5e4fd08d15a2.png)

## サンプルのConsumerを動かす

サイトには[Examples](http://activemq.apache.org/examples.html)が用意されているのでそれを参考にConsumerを動かしてみる。
 
(このExampleのページ見つけた段階で、Web Console経由しないで初めからコマンドラインでProducerとConsumerのサンプル動かせばよかったのでは? と思い始めたが、せっかくなのでメッセージの送信はWeb Consoleから行う)

```shell-session
# /opt/activemq/bin/activemq consumer --destination queue://MyTestQue
```
リスニングし始めたっぽいメッセージがでてきた!!

```
INFO: Loading '/opt/apache-activemq-5.15.2//bin/env'
INFO: Using java '/usr/bin/java'
Java Runtime: Oracle Corporation 1.8.0_151 /usr/lib/jvm/java-8-openjdk-amd64/jre
  Heap sizes: current=62976k  free=61992k  max=932352k
    JVM args: -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/opt/apache-activemq-5.15.2//conf/login.config -Dactivemq.classpath=/opt/apache-activemq-5.15.2//conf:/opt/apache-activemq-5.15.2//../lib/: -Dactivemq.home=/opt/apache-activemq-5.15.2/ -Dactivemq.base=/opt/apache-activemq-5.15.2/ -Dactivemq.conf=/opt/apache-activemq-5.15.2//conf -Dactivemq.data=/opt/apache-activemq-5.15.2//data
Extensions classpath:
  [/opt/apache-activemq-5.15.2/lib,/opt/apache-activemq-5.15.2/lib/camel,/opt/apache-activemq-5.15.2/lib/optional,/opt/apache-activemq-5.15.2/lib/web,/opt/apache-activemq-5.15.2/lib/extra]
ACTIVEMQ_HOME: /opt/apache-activemq-5.15.2
ACTIVEMQ_BASE: /opt/apache-activemq-5.15.2
ACTIVEMQ_CONF: /opt/apache-activemq-5.15.2/conf
ACTIVEMQ_DATA: /opt/apache-activemq-5.15.2/data
 INFO | Connecting to URL: failover://tcp://localhost:61616 as user: null
 INFO | Consuming queue://MyTestQue
 INFO | Sleeping between receives 0 ms
 INFO | Running 1 parallel threads
 INFO | Successfully connected to tcp://localhost:61616
 INFO | consumer-1 wait until 1000 messages are consumed
```

Web Consoleの方も確認してみるとこのQueueに対するConsumerが追加されていることがわかる。

![Screen Shot 2017-12-03 at 2.35.22.png](https://qiita-image-store.s3.amazonaws.com/0/215058/e1f3415c-9491-d4ab-3a58-2f6d3defb1ef.png)


## Queueにメッセージを送ってみる

![Screen Shot 2017-12-03 at 2.37.27.png](https://qiita-image-store.s3.amazonaws.com/0/215058/a404cba5-caa8-65ac-6b6f-788af5407aad.png)

![Screen Shot 2017-12-03 at 2.40.09.png](https://qiita-image-store.s3.amazonaws.com/0/215058/a8628439-a100-ac2b-93f2-c3b880faf4c2.png)

## Consoleで確認

```
 INFO | consumer-1 Received Hello This is my first message
```

送信されたメッセージを受け取っているっぽい

## せっかくなので複数のConsumerに対してQueueにメッセージを送ってみる

### Consumerを3つ立ち上げる

```shell-session:Console1
# /opt/activemq/bin/activemq consumer --destination queue://MyTestQue
```
```shell-session:Console2
# /opt/activemq/bin/activemq consumer --destination queue://MyTestQue
```
```shell-session:Console3
# /opt/activemq/bin/activemq consumer --destination queue://MyTestQue
```

![Screen Shot 2017-12-03 at 3.52.00.png](https://qiita-image-store.s3.amazonaws.com/0/215058/935f23ec-4f36-cd16-fcc5-236e5b4cd76f.png)

### Producerを立ち上げてメッセージを送る

```shell-session:Console4
# /opt/activemq/bin/activemq producer --message "HeyHeyHey" --destination queue://MyTestQue --messageCount 1
```

### Consumer側でメッセージ受信できているか確認

```shell-session:Console1
 INFO | consumer-1 Received HeyHeyHey
```
```shell-session:Console2

```
```shell-session:Console3

```

1つのConsumerがメッセージを受信している。

## せっかくなので複数のConsumerに対してTopicにメッセージを送ってみる

### Consumerを3つ立ち上げる

```shell-session:Console1
# /opt/activemq/bin/activemq consumer --destination topic://MyTestTopic
```
```shell-session:Console2
# /opt/activemq/bin/activemq consumer --destination topic://MyTestTopic
```
```shell-session:Console3
# /opt/activemq/bin/activemq consumer --destination topic://MyTestTopic
```

### Producerを立ち上げてメッセージを送る

```shell-session:Console4
# /opt/activemq/bin/activemq producer --message "FooFooFoo" --destination topic://MyTestTopic --messageCount 1
```

### Consumer側でメッセージ受信できているか確認

```shell-session:Console1
 INFO | consumer-1 Received FooFooFoo
```
```shell-session:Console2
 INFO | consumer-1 Received FooFooFoo
```
```shell-session:Console3
 INFO | consumer-1 Received FooFooFoo
```
全てのConsumerがメッセージを受信できている。

## QueueとTopicの違い

http://activemq.apache.org/how-does-a-queue-compare-to-a-topic.html

ざっくりとしたQueueとTopicの違いはこんな感じらしい

|名前|セマンティック|メッセージ受信の仕方|
|---|---|---|
|Queues|ロードバランサ|その時アクティブな1つのConsumerにメッセージが送られる。<br> アクティブなConsumerがいなければ、アクティブなConsumerが現れるまでメッセージは保留される。|
|Topics|Pub/Sub|その時アクティブな全てのConsumerにメッセージが送られる。|



## 感想

デモ用プログラムも結構あるみたいなので、次は自分で簡単なProducerとConsumerを作ってみることにする。