メッセージサーバのインストール

最終更新日: 2020年3月14日
R8 | R9

Apache ActiveMQ Artemis

Apache ActiveMQ Artemis は Apache が提供している Java Message Service (JMS) に対応したオープンソースソフトウェアです。

1. 次のサイトから apache-artemis-2.6.4-bin.zip をダウンロードします。(バージョン番号は最新のものに読み替えてください。)

ダウンロードアーカイブを展開します。ここでは C:\home\wagby に展開したものとします。

2. Brokerを作成します。usernameに "admin"、passwordに "admin"、Allow anonymous accessに "n" を入力した例を示します。

C:\home\wagby\apache-artemis-2.6.4\bin>artemis.cmd create mybroker
Creating ActiveMQ Artemis instance at: C:\home\wagby\apache-artemis-2.6.4\bin\mybroker
--user: is a mandatory property!
Please provide the default username:
admin
--password: is mandatory with this configuration:
Please provide the default password:
--allow-anonymous | --require-login: is a mandatory property!
Allow anonymous access?, valid values are Y,N,True,False
n
Auto tuning journal ...
done! Your system can make 0.23 writes per millisecond, your journal-buffer-timeout will be 4328000
You can now start the broker by executing:
   "C:\home\wagby\apache-artemis-2.6.4\bin\mybroker\bin\artemis" run
Or you can setup the broker as Windows service and run it in the background:
   "C:\home\wagby\apache-artemis-2.6.4\bin\mybroker\bin\artemis-service.exe" install
   "C:\home\wagby\apache-artemis-2.6.4\bin\mybroker\bin\artemis-service.exe" start
   To stop the windows service:
      "C:\home\wagby\apache-artemis-2.6.4\bin\mybroker\bin\artemis-service.exe" stop
   To uninstall the windows service
      "C:\home\wagby\apache-artemis-2.6.4\bin\mybroker\bin\artemis-service.exe" uninstall

3. 起動します。

C:\home\wagby\apache-artemis-2.6.4\bin>cd mybroker\bin
C:\home\wagby\apache-artemis-2.6.4\bin\mybroker\bin>artemis.cmd run
     _        _               _
    / \  ____| |_  ___ __  __(_) _____
   / _ \|  _ \ __|/ _ \  \/  | |/  __/
  / ___ \ | \/ |_/  __/ |\/| | |\___ \
 /_/   \_\|   \__\____|_|  |_|_|/___ /
 Apache ActiveMQ Artemis 2.6.4
2019-02-06 18:19:54,342 INFO  [org.apache.activemq.artemis.integration.bootstrap] AMQ101000: Starting ActiveMQ Artemis Server
2019-02-06 18:19:54,588 INFO  [org.apache.activemq.artemis.core.server] AMQ221000: live Message Broker is starting with configuration Broker Configuration (clustered=false,journalDirectory=data/journal,bindingsDirectory=data/bindings,largeMessagesDirectory=data/large-messages,pagingDirectory=data/paging)
2019-02-06 18:19:54,613 INFO  [org.apache.activemq.artemis.core.server] AMQ221013: Using NIO Journal
2019-02-06 18:19:54,643 INFO  [org.apache.activemq.artemis.core.server] AMQ221057: Global Max Size is being adjusted to 1/2 of the JVM max size (-Xmx). being defined as 536,870,912
2019-02-06 18:19:54,662 INFO  [org.apache.activemq.artemis.core.server] AMQ221043: Protocol module found: [artemis-server]. Adding protocol support for: CORE
2019-02-06 18:19:54,663 INFO  [org.apache.activemq.artemis.core.server] AMQ221043: Protocol module found: [artemis-amqp-protocol]. Adding protocol support for: AMQP
2019-02-06 18:19:54,663 INFO  [org.apache.activemq.artemis.core.server] AMQ221043: Protocol module found: [artemis-hornetq-protocol]. Adding protocol support for: HORNETQ
2019-02-06 18:19:54,664 INFO  [org.apache.activemq.artemis.core.server] AMQ221043: Protocol module found: [artemis-mqtt-protocol]. Adding protocol support for: MQTT
2019-02-06 18:19:54,664 INFO  [org.apache.activemq.artemis.core.server] AMQ221043: Protocol module found: [artemis-openwire-protocol]. Adding protocol support for: OPENWIRE
2019-02-06 18:19:54,665 INFO  [org.apache.activemq.artemis.core.server] AMQ221043: Protocol module found: [artemis-stomp-protocol]. Adding protocol support for: STOMP
2019-02-06 18:19:54,707 INFO  [org.apache.activemq.artemis.core.server] AMQ221034: Waiting indefinitely to obtain live lock
2019-02-06 18:19:54,708 INFO  [org.apache.activemq.artemis.core.server] AMQ221035: Live Server Obtained live lock
2019-02-06 18:19:54,892 INFO  [org.apache.activemq.artemis.core.server] AMQ221080: Deploying address DLQ supporting [ANYCAST]
2019-02-06 18:19:54,924 INFO  [org.apache.activemq.artemis.core.server] AMQ221003: Deploying ANYCAST queue DLQ on address DLQ
2019-02-06 18:19:54,988 INFO  [org.apache.activemq.artemis.core.server] AMQ221080: Deploying address ExpiryQueue supporting [ANYCAST]
2019-02-06 18:19:54,993 INFO  [org.apache.activemq.artemis.core.server] AMQ221003: Deploying ANYCAST queue ExpiryQueue on address ExpiryQueue
2019-02-06 18:19:55,440 INFO  [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:61616 for protocols [CORE,MQTT,AMQP,STOMP,HORNETQ,OPENWIRE]
2019-02-06 18:19:55,457 INFO  [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:5445 for protocols [HORNETQ,STOMP]
2019-02-06 18:19:55,473 INFO  [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:5672 for protocols [AMQP]
2019-02-06 18:19:55,489 INFO  [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:1883 for protocols [MQTT]
2019-02-06 18:19:55,505 INFO  [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:61613 for protocols [STOMP]
2019-02-06 18:19:55,515 INFO  [org.apache.activemq.artemis.core.server] AMQ221007: Server is now live
2019-02-06 18:19:55,515 INFO  [org.apache.activemq.artemis.core.server] AMQ221001: Apache ActiveMQ Artemis Message Broker version 2.6.4 [0.0.0.0, nodeID=5d4ce1a5-29f0-11e9-9c7b-00155d069193]
2019-02-06 18:19:55,912 INFO  [org.apache.activemq.hawtio.branding.PluginContextListener] Initialized activemq-branding plugin
2019-02-06 18:19:56,295 INFO  [org.apache.activemq.hawtio.plugin.PluginContextListener] Initialized artemis-plugin plugin
2019-02-06 18:20:00,209 WARN  [org.apache.activemq.artemis.core.server] AMQ222210: Storage usage is beyond max-disk-usage. System will start blocking producers.
2019-02-06 18:20:02,511 INFO  [io.hawt.HawtioContextListener] Initialising hawtio services
2019-02-06 18:20:02,534 INFO  [io.hawt.system.ConfigManager] Configuration will be discovered via system properties
2019-02-06 18:20:02,538 INFO  [io.hawt.jmx.JmxTreeWatcher] Welcome to hawtio 1.5.5 : http://hawt.io/ : Don't cha wish your console was hawt like me? ;-)
2019-02-06 18:20:02,542 INFO  [io.hawt.jmx.UploadManager] Using file upload directory: C:\home\wagby\apache-artemis-2.6.4\bin\mybroker\tmp\uploads
2019-02-06 18:20:02,577 INFO  [io.hawt.web.AuthenticationFilter] Starting hawtio authentication filter, JAAS realm: "activemq" authorized role(s): "amq" role principal classes: "org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal"
2019-02-06 18:20:02,656 INFO  [io.hawt.web.JolokiaConfiguredAgentServlet] Jolokia overridden property: [key=policyLocation, value=file:/C:/cygwin64/home/mura/apache-artemis-2.6.4/bin/mybroker/etc/\jolokia-access.xml]
2019-02-06 18:20:02,779 INFO  [io.hawt.web.RBACMBeanInvoker] Using MBean [hawtio:type=security,area=jmx,rank=0,name=HawtioDummyJMXSecurity] for role based access control
2019-02-06 18:20:12,212 INFO  [io.hawt.system.ProxyWhitelist] Initial proxy whitelist: [localhost, 127.0.0.1, 10.0.75.1, mura-pc2, 192.168.107.97, mura-pc2.mshome.net, 192.168.6.145]
2019-02-06 18:20:12,652 INFO  [org.apache.activemq.artemis] AMQ241001: HTTP Server started at http://localhost:8161
2019-02-06 18:20:12,652 INFO  [org.apache.activemq.artemis] AMQ241002: Artemis Jolokia REST API available at http://localhost:8161/console/jolokia
2019-02-06 18:20:12,653 INFO  [org.apache.activemq.artemis] AMQ241004: Artemis Console available at http://localhost:8161/console
2019-02-06 18:24:41,309 INFO  [io.hawt.web.keycloak.KeycloakServlet] Keycloak integration is disabled
2019-02-06 18:24:47,737 INFO  [io.hawt.web.LoginServlet] hawtio login is using 1800 sec. HttpSession timeout

ポート番号の確認

ログで、起動したサーバのポート番号を確認できます。

2019-02-06 18:19:55,440 INFO  [org.apache.activemq.artemis.core.server] AMQ221020: Started NIO Acceptor at 0.0.0.0:61616 for protocols [CORE,MQTT,AMQP,STOMP,HORNETQ,OPENWIRE]

状態の確認

ログに表示されているHTTP ServerのURLにアクセスすると、Queueの状態やサーバの設定などを確認することができます。 ブローカー作成時に設定したアカウント、パスワードでログオンすることができます。

2019-02-06 18:20:12,653 INFO  [org.apache.activemq.artemis] AMQ241004: Artemis Console available at http://localhost:8161/console

ディスク容量にご注意ください

ディスク容量が90パーセント以上使用されている場合、デフォルトの設定だと、メッセージの送信に失敗します。Artemisのコンソールログに次のようなメッセージが表示されます。

2019-03-07 17:06:56,359 WARN  [org.apache.activemq.artemis.core.server] AMQ222212: Disk Full! Blocking message production on address 'wagbyJobQueue'. Clients will report blocked.

ただしこのとき、wagbyapp アプリケーションでは読み込み中のままとなっています。この状態でArtemisを終了すると次のエラーがwagbyappアプリケーションのログ(system.log)に出力されます。

2019-03-07 17:06:56 [DEBUG jp.jasminesoft.jfc.job.JfcjobstatusRegistryServiceJmsImpl sendJobMessage] use defaultDestinationName wagbyJobQueue
2019-03-07 17:06:56 [INFO jp.jasminesoft.jfc.job.JfcjobstatusRegistryServiceJmsImpl sendJobMessage] send jobmessage. destinationName=wagbyJobQueue, jobname=DownloadModel1Job, username=admin
2019-03-07 17:08:36 [WARN org.springframework.jms.listener.DefaultMessageListenerContainer handleListenerSetupFailure] Setup of JMS message listener invoker failed for destination 'wagbyJobQueue' - trying to recover. Cause: java.io.EOFException
2019-03-07 17:08:36 [WARN org.springframework.jms.listener.DefaultMessageListenerContainer handleListenerSetupFailure] Setup of JMS message listener invoker failed for destination 'wagbyUploadUpdateJobQueue' - trying to recover. Cause: java.io.EOFException
2019-03-07 17:08:36 [DEBUG jp.jasminesoft.jfc.job.JfcjobstatusRegistryServiceJmsImpl sendJobMessage] failed, occur Exception
org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Disposed due to prior exception
        at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316)
        at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:169)
        at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:487)
        at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:570)
        at org.springframework.jms.core.JmsTemplate.convertAndSend(JmsTemplate.java:658)
        at jp.jasminesoft.jfc.job.JfcjobstatusRegistryServiceJmsImpl.sendJobMessage(JfcjobstatusRegistryServiceJmsImpl.java:101)
        at jp.jasminesoft.wagby.controller.model1.DownloadModel1Controller.sendJobMessage(DownloadModel1Controller.java:305)
        at jp.jasminesoft.wagby.controller.model1.DownloadModel1Controller.do_downloadData(DownloadModel1Controller.java:270)
...
2019-03-07 17:08:37 [ERROR org.springframework.jms.listener.DefaultMessageListenerContainer refreshConnectionUntilSuccessful] Could not refresh JMS Connection for destination 'wagbyJobQueue' - retrying using FixedBackOff{interval=5000, currentAttempts=0, maxAttempts=unlimited}. Cause: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect
2019-03-07 17:08:37 [ERROR org.springframework.jms.listener.DefaultMessageListenerContainer refreshConnectionUntilSuccessful] Could not refresh JMS Connection for destination 'wagbyUploadUpdateJobQueue' - retrying using FixedBackOff{interval=5000, currentAttempts=0, maxAttempts=unlimited}. Cause: Could not connect to broker URL: tcp://localhost:61616. Reason: java.net.ConnectException: Connection refused: connect

この対策として、apache-artemis-2.6.4\bin\mybroker\etc\broker.xmlの設定を90から100に変更するとよいでしょう。

      <!-- once the disk hits this limit the system will block, or close the connection in certain protocols
           that won't support flow control. -->
      <max-disk-usage>90</max-disk-usage>

終了

Ctrl-Cにて終了することができます。

Rabbit MQ

Rabbit MQ は Pivotal 社が提供するオープンソース製品です。

Cent OS 6

yumによるインストール

Cent OS 6 では、下記の手順でインストールすることができます。

$ sudo yum install rabbitmq-server
$ sudo chkconfig --list rabbitmq-server
rabbitmq-server 0:off   1:off   2:off   3:off   4:off   5:off   6:off
$ sudo chkconfig rabbitmq-server on
$ sudo chkconfig --list rabbitmq-server
rabbitmq-server 0:off   1:off   2:on    3:on    4:on    5:on    6:off
$ sudo service rabbitmq-server start
Starting rabbitmq-server: SUCCESS
rabbitmq-server.

実行中かどうかを確認する

次のコマンドで、Rabbit MQ が実行中であることを確認できます。

$ sudo -u rabbitmq -i
$ rabbitmqctl status
Status of node rabbit@<ホスト名> ...
[{pid,9988},
{running_applications,[{rabbit,"RabbitMQ","3.1.5"},
...

rabbitmqctl list_users で guestユーザが存在していることを確認できます。

$ rabbitmqctl list_users
Listing users ...
guest   [administrator]
...done.

参考資料

Amazon MQ

AmazonMQ は AWS で利用できる Apache ActiveMQ のサービスです。

AmazonMQのインスタンスを作成する

AWS が提供する次の手順に従って、ActiveMQ メッセージングブローカーを作成します。

テストで用いた設定は次のとおりです。

  • "デプロイの選択" は "単一ブローカーのデプロイ" とする。
  • "ブローカーのネットワークのサンプル設計図" はいずれも選択しない。
  • "詳細 > ブローカー名" を "mybroker" とする。
  • "ブローカーインスタンスタイプ" を "mq.t2.tokyo" とする。
  • "ActiveMQウェブコンソールのアクセス" で、適切なアカウント/パスワードを設定する。
  • "ブローカーエンジンバージョン" は最新のものを選択する。テスト時は "5.15.8" を指定した。
  • "ブローカー設定" は "デフォルト値で新しい設定を作成する" とする。
  • "ログ > CloudWatch Logs" は選択しない。("全般","監査" いずれのチェックボックスもチェックしない)
  • "ネットワークとセキュリティ" は "既存のVPCとサブネットを選択する" とし、事前に用意した VPC を選択する。
  • "サブネット" も事前に用意したサブネットを選択する。
  • "セキュリティグループ" は "既存のセキュリティグループの選択" を選び、事前に作成したセキュリティグループを入力する。
  • "パブリックアクセシビリティ" は "はい" を選択する。
  • "メンテナンス > 自動マイナーバージョンアップグレードの有効化" は、テスト環境なので指定していない。
  • "メンテナンスウィンドウ" は "指定なし" を選択する。
  • "タグ - オプション" は追加していない。

ブローカーの作成には15分ほどかかります。作成後は Web コンソールでブローカーの情報を確認できます。 テスト環境では、エンドポイントとして OpenWire, AMQP, STOMP, MQTT, WSS が用意されました。

EC2インスタンスでのWagbyアプリケーションの起動

EC2インスタンスを作成し、Wagbyアプリケーションを転送して、動作確認します。

EC2インスタンスの作成時に8921番ポートを外部からアクセスできるようにセキュリティグループに設定してください。
また、Wagbyアプリケーションは次節の「メッセージキューの設定」に従ってください。

以降、EC2インスタンスへのscpによるファイル転送とssh接続によるコマンド実行を行って、Wagbyアプリケーションを実行するまでの操作を記します。

$ scp -i ~/.ssh/YOURkey1 wagbyapp.zip ec2-user@ec2-54-238-88-156.ap-northeast-1.compute.amazonaws.com:
Enter passphrase for key '/home/mura/.ssh/YOURkey1':
activemqtest_wagbyapp_20190307.tar.gz         100%  123MB   5.4MB/s   00:22
$ ssh -i ~/.ssh/YOURkey1 ec2-user@ec2-54-238-88-156.ap-northeast-1.compute.amazonaws.com
...
[ec2-user@ip-172-30-2-40 ~]$ sudo yum install java-1.8.0-openjdk-devel
...
[ec2-user@ip-172-30-2-40 ~]$ unzip wagbyapp.zip
...
[ec2-user@ip-172-30-2-40 ~]$ cd wagbyapp/bin/
[ec2-user@ip-172-30-2-40 bin]$ ./startup.sh
Using CATALINA_BASE:   /home/ec2-user/wagbyapp
Using CATALINA_HOME:   /home/ec2-user/wagbyapp
Using CATALINA_TMPDIR: /home/ec2-user/wagbyapp/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /home/ec2-user/wagbyapp/bin/bootstrap.jar:/home/ec2-user/wagbyapp/bin/tomcat-juli.jar
Tomcat started.
[ec2-user@ip-172-30-2-40 bin]$ tail -f ../logs/catalina.out
...
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v1.5.14.RELEASE)
07-Mar-2019 17:31:39.972 INFO [localhost-startStop-1] org.hsqldb.persist.Logger.logInfoEvent open start - state modified
07-Mar-2019 17:31:40.174 INFO [localhost-startStop-1] org.hsqldb.persist.Logger.logInfoEvent checkpointClose start
07-Mar-2019 17:31:40.178 INFO [localhost-startStop-1] org.hsqldb.persist.Logger.logInfoEvent checkpointClose synched
07-Mar-2019 17:31:40.220 INFO [localhost-startStop-1] org.hsqldb.persist.Logger.logInfoEvent checkpointClose script done
07-Mar-2019 17:31:40.226 INFO [localhost-startStop-1] org.hsqldb.persist.Logger.logInfoEvent checkpointClose end
07-Mar-2019 17:32:14.325 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/home/ec2-user/wagbyapp/webapps/wagby] has finished in [68,005] ms
07-Mar-2019 17:32:14.328 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8921"]
07-Mar-2019 17:32:14.336 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
07-Mar-2019 17:32:14.338 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 68096 ms

次のURLでアクセスできることを確認します。(URLは適切に読み替えてください。)

http://ec2-54-238-88-156.ap-northeast-1.compute.amazonaws.com:8921/wagby/

セキュリティグループの設定

61617番ポートを外部からアクセスできるようにセキュリティグループに設定します。

Wagbyアプリケーションの設定変更

EC2インスタンス上の次のファイルの設定を修正し、Wagbyアプリケーションを再起動してください。(修正後のURLは、お使いのAWS環境にあわせて適切に読み替えてください。)

  • wagbyapp/webapps/wagby/WEB-INF/classes/application.properties

修正前:

spring.activemq.broker-url=failover:tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin

修正後:

spring.activemq.broker-url=failover:ssl://b-51d382de-d5a3-42c2-8d29-5a51d0489a0b-1.mq.ap-northeast-1.amazonaws.com:61617
spring.activemq.user=<設定したアカウント>
spring.activemq.password=<設定したパスワード>

注意

オートスケールを設定している場合、キャッシュの制御にActiveMQを用いるため、同様の設定が wagbyapp/webapps/wagby/WEB-INF/classes/ehcache.xml にもあります。こちらも修正してください。

動作の確認

次のURLにてアクセスして、非同期処理のダウンロードやアップロード更新が行えるかを確認します。(URLは適切に読み替えてください。)

http://ec2-54-238-88-156.ap-northeast-1.compute.amazonaws.com:8921/wagby/

トラブルシューティング

接続できない場合はログファイル(system.log)に次のようなエラーが出力されます。

2019-03-07 18:18:31 [ERROR org.springframework.jms.listener.DefaultMessageListenerContainer refreshConnectionUntilSuccessful] Could not refresh JMS Connection for destination 'wagbyJobQueue' - retrying using FixedBackOff{interval=5000, currentAttempts=1, maxAttempts=unlimited}. Cause: Could not connect to broker URL: ssl://b-51d382de-d5a3-42c2-8d29-5a51d0489a0b-1.mq.ap-northeast-1.amazonaws.com:61617. Reason: java.net.SocketException: Socket closed

次の点をご確認ください。

  • EC2インスタンスとAmazonMQインスタンスが同一VPC、同一サブネットとなっていること。
  • セキュリティグループに61617番が含まれていること。