3.5. ネットワーク接続による STOMP の使用
STOMP は、STOMP クライアントが STOMP Broker と通信できるようにするテキスト指向のワイヤプロトコルです。ブローカーは STOMP 1.0、1.1、および 1.2 をサポートします。STOMP クライアントは複数の言語やプラットフォームで利用できます。これにより、相互運用性の選択肢があります。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 -
既存の
acceptor
を設定するか、新しいアクセプターを作成し、以下のようにSTOMP
の値を持つprotocols
パラメーターを追加します。
<acceptors> <acceptor name="stomp-acceptor">tcp://localhost:61613?protocols=STOMP</acceptor> ... </acceptors>
上記の例では、ブローカーはポート 61613
の STOMP 接続を受け入れます。
STOMP を使用してブローカーを設定する方法の例は、STOMP の例 を参照してください。
3.5.1. STOMP の制限
STOMP を使用する場合、以下の制限が適用されます。
-
現在、ブローカーは仮想ホストをサポートしません。つまり、
host
フレームのCONNECT
ヘッダーは無視されます。 -
メッセージの完了通知はトランザクションではありません。
ACK
フレームはトランザクションの一部にできず、transaction
ヘッダーが設定されている場合は無視されます。
3.5.2. STOMP メッセージの ID の提供
JMS コンシューマーまたは QueueBrowser を介して STOMP メッセージを受信する場合、メッセージには JMSMessageID
などの JMS プロパティーは含まれません。ただし、ブローカーパラメーターを使用して、各受信 STOMP メッセージにメッセージ ID を設定できます。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 -
以下の例のように、STOMP 接続に使用される
acceptor
のstompEnableMessageId
パラメーターをtrue
に設定します。
<acceptors> <acceptor name="stomp-acceptor">tcp://localhost:61613?protocols=STOMP;stompEnableMessageId=true</acceptor> ... </acceptors>
stompEnableMessageId
パラメーターを使用することで、このアクセプターを使用して送信される各 stomp メッセージには追加のプロパティーが追加されます。次の例に示すように、プロパティーキーは amq-message-id
で、値は "STOMP" という接頭辞が付いた内部メッセージ ID の文字列表現です。
amq-message-id : STOMP12345
設定で stompEnableMessageId
が指定されていない場合、デフォルト値は false
になります。
3.5.3. 接続時間のライブの設定
STOMP クライアントは、接続を閉じる前に DISCONNECT
フレームを送信する必要があります。これにより、ブローカーはセッションやコンシューマーなどのサーバー側のリソースを閉じることができます。ただし、STOMP クライアントが DISCONNECT フレームを送信せずに終了する場合、または失敗すると、ブローカーにはクライアントが有効であるかどうかを即座に認識することができません。そのため、STOMP の接続は "Time to Live" (TTL) が 1 分となるように設定されています。複数の 1 分間の間アイドル状態であった場合、ブローカーは STOMP クライアントへの接続を停止します。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 -
以下の例のように、STOMP 接続に使用される
acceptor
の URI にconnectionTTL
パラメーターを追加します。
<acceptors> <acceptor name="stomp-acceptor">tcp://localhost:61613?protocols=STOMP;connectionTTL=20000</acceptor> ... </acceptors>
上記の例では、stomp -acceptor
を使用するすべての stomp 接続では、その TTL を 20 秒に設定します。
STOMP プロトコルのバージョン 1.0 にはハートビートフレームが含まれていません。そのため、ユーザーは、データが connection-ttl 内に送信されることを確認するか、ブローカーがクライアントが停止されサーバー側のリソースをクリーンアップすることを想定します。バージョン 1.1 では、c he-beats を使用して stomp 接続のライフサイクルを維持することができます。
ブローカーのデフォルト時間の上書き
前述のように、STOMP 接続のデフォルトの TTL は 1 分です。この値は、connection-ttl-override
属性をブローカー設定に追加することで上書きできます。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 -
connection-ttl-override
属性を追加し、新しいデフォルトの値をミリ秒単位で指定します。以下のように、<core>
スタンザに属します。
<configuration ...> ... <core ...> ... <connection-ttl-override>30000</connection-ttl-override> ... </core> <configuration>
上記の例では、STOMP 接続のデフォルトの Time to Live(TTL) は 30 秒 (30000
ミリ秒) に設定されます。
3.5.4. JMS からの STOMP メッセージの送受信
STOMP は主にテキスト指向のプロトコルです。JMS と相互運用を容易にするため、STOMP 実装は content-length
ヘッダーの有無を確認し、STOMP メッセージを JMS にマップする方法を決定します。
STOMP のメッセージのマッピング先 | メッセージ |
---|---|
JMS TextMessage |
|
JMS BytesMessage |
|
JMS メッセージを STOMP にマップする場合も、同じロジックが適用されます。STOMP クライアントは、content-length
ヘッダーが存在することを確認して、メッセージボディーのタイプ (文字列またはバイト) を判別できます。
メッセージヘッダーの詳細は、STOMP 仕様を参照してください。
3.5.5. STOMP 宛先の AMQ Broker アドレスおよびキューへのマッピング
メッセージを送信してサブスクライブする場合、STOMP クライアントには通常、destination
ヘッダーが含まれます。宛先名は文字列の値で、ブローカーの宛先にマッピングされます。AMQ Broker では、これらの宛先は アドレス および キュー にマッピングされます。宛先フレームの詳細は、STOMP 仕様を参照してください。
たとえば、以下のメッセージ (ヘッダーおよびボディー) を送信する STOMP クライアントの例を考えます。
SEND destination:/my/stomp/queue hello queue a ^@
この場合、ブローカーは /my/stomp/queue
アドレスに関連付けられたキューへメッセージを転送します。
たとえば、STOMP クライアントが (SEND
フレームを使用して) メッセージを送信する場合、指定された宛先がアドレスにマッピングされます。
これは、クライアントが SUBSCRIBE
または UNSUBSCRIBE
フレームを送信する場合と同じように機能しますが、この場合は AMQ Broker は destination
をキューにマッピングします。
SUBSCRIBE destination: /other/stomp/queue ack: client ^@
上記の例では、ブローカーは destination
をキュー /other/stomp/queue
にマップします。
STOMP 宛先と JMS 宛先のマッピング
JMS 宛先は、ブローカーアドレスおよびキューにマッピングされます。STOMP を使用してメッセージを JMS 宛先に送信する場合、STOMP 宛先は同じ規則に従う必要があります。
JMS Queue を送受信するには、
jms.queue.
でキュー名を追加します。たとえば、JMS キューのorders
にメッセージを送信するには、STOMP クライアントはフレームを送信する必要があります。SEND destination:jms.queue.orders hello queue orders ^@
jms.topic.
でトピック名を追加し、JMS Topic を送信またはサブスクライブします。たとえば、stocks
JMS Topic をサブスクライブするには、STOMP クライアントは以下のようなフレームを送信する必要があります。SUBSCRIBE destination:jms.topic.stocks ^@