はじめに
Liberty と Active MQ Artemis で JMS構成をするのに苦労したところを同じことを調べなくて良いように残しておきます。
以下のページを更新します。
ActiveMQ Artemisを起動
を元にArtemis MQを起動します。
docker run --rm -e AMQ_USER=admin -e AMQ_PASSWORD=admin -p 61616:61616 --name artemis quay.io/artemiscloud/activemq-artemis-broker
最新のResource Adapterを使う
Java8で動かそうと古いResource Adapterで試していましたが、なかなか動いてくれませんでした。Javaを新しいものに変えることでResource Adapterも新しいものが使えるので、うまくいかないときは修正が含まれる最新をためすのが良いです。
2024/2/29 現在 2.31.2 でした。
Libertyの server.xml を更新
もともとあった構成はActiveMQのものでこれを元に更新します。
変更点
- resource adapter の id を artemis に変更 >> properties の後の指定も変わる
- 実装にあわせたプロパティ名を使えるのでプロパティも変わる
- rar を /tmp/artemis-rar-2.31.2.rar に配置して、それを読むように変える
- jmsQueueConnectionFactory を connectionFactory に変える
- brokerUrlが設定できなくなるので消す
使用できるプロパティは以下を参考にします。
<server>
<featureManager>
<feature>ejb-3.2</feature>
<feature>localConnector-1.0</feature>
<feature>servlet-4.0</feature>
<feature>jsp-2.3</feature>
<feature>wasJmsClient-2.0</feature>
</featureManager>
<httpEndpoint host="*" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint">
</httpEndpoint>
<resourceAdapter id="artemis" location="/tmp/artemis-rar-2.31.2.rar">
<properties.artemis connectionParameters="host=localhost;port=61616" />
</resourceAdapter>
<jmsActivationSpec id="jms/PdprofMdb">
<properties.artemis destinationRef="Q3" destinationType="javax.jms.Queue"/>
</jmsActivationSpec>
<connectionFactory connectionManagerRef="ConMgr6" jndiName="QCF">
<properties.artemis/>
</connectionFactory>
<connectionManager id="ConMgr6" maxPoolSize="5"/>
<jmsQueue jndiName="Q1">
<properties.artemis Address="Q1"/>
</jmsQueue>
<jmsQueue id="Q2" jndiName="Q2">
<properties.artemis Address="Q2"/>
</jmsQueue>
<jmsQueue id="Q3" jndiName="Q3">
<properties.artemis Address="Q3"/>
</jmsQueue>
<applicationMonitor updateTrigger="mbean"/>
<webApplication id="jms" location="jms.war" name="jms"/>
<logging traceSpecification="*=info"
traceFileName="trace.log"
maxFileSize="20"
maxFiles="10"
traceFormat="BASIC" />
</server>
sendの時の commitを追加
ここまででサンプルアプリケーションの send がエラーなく動作するようになるのですが、なぜかキューにメッセージがPUTできない。アプリケーションのコードで commmit を追加してやることでうまく動作します。他のResource Adapterだといらなかったのになぜというところだけど、ひとまず動くことを確認してからあるべき動作を確認していきます。
QueueSession.commit() を QueueSender.send(...) の後に入れることで動くようになりました。
まとめ
同じような苦労をしないように、今回知る事のできた内容をまとめました。