メッセージ管理でのSTOMPの使用

STOMPメッセージ・プロトコルを使用して、キューのメッセージを公開、消費、管理します。

概要

STOMPは、認証がリクエストごとに1回ではなく、接続ごとに1回行われるため、生成と消費の効率を高めることができるオープン・メッセージング・プロトコルです。キュー・サービスでは、STOMP仕様1.0、1.1および1.2がサポートされています。STOMPとRESTの両方を使用して、同じキューに公開して消費できます。

キューによるSTOMPのサポート方法の詳細は、次の項を参照してください。

ノート

キューはカスタム・ヘッダーまたはトランザクション(STOMPフレームBEGIN/COMMIT/ABORT)をサポートしていません。BEGIN/COMMIT/ABORTが使用されている場合、キューはERRORフレームを返し、接続を終了します。

接続および認証

クライアントは、CONNECTまたはSTOMPフレームを使用して、ポート61613のメッセージ・エンドポイント上のキュー・サービスに接続できます。キューのメッセージ・エンドポイントを検索する詳細な手順は、メッセージ・エンドポイントを参照してください。

STOMPプロトコルでの認証には、認証トークンを使用します。認証トークンはbase64でエンコードされている必要があります。コンソールのユーザー詳細ページでトークンを生成できます。詳細は、認証トークンの操作を参照してください。

ヒント

専用グループまたはユーザーを作成し、適切なコンパートメントまたはテナンシ内のキューを管理する権限を付与します。次に、作成したユーザーの認証トークンを生成し、STOMPクライアント構成で使用します。キュー管理に必要な権限の詳細は、キュー・ポリシーおよびポリシーの例を参照してください。

SEND

SENDフレームを使用してメッセージを生成します。SENDフレームには、次のヘッダーを含めることができます:

  • destination: (必須)メッセージの公開先のキューのOCID (Oracle Cloud Identifier)。オプションで、指定したチャネルに公開するチャネルIDを含めることができます。たとえば:

    <queue_OCID>/<channel_ID>
  • receipt: (オプション) SENDフレームにreceiptヘッダーが含まれている場合、キューは公開が成功するとクライアントにRECEIPTフレームを送信し、エラーの場合はERRORフレームを送信します。
    ノート

    receiptヘッダーがない場合、キュー・サービスはRECEIPTフレームを送信しませんが、エラー時にはERRORフレームを送信する場合があります。

transactionヘッダーおよびカスタム・ヘッダーはサポートされていません。サポートされていないヘッダーが含まれている場合、キューはERRORフレームを送信し、接続を終了します。

SUBSCRIBE

SUBSCRIBEフレームを使用してメッセージを消費します。SUBSCRIBEフレームは、長いポーリングGetMessagesリクエストと等しくなります。サブスクライブされた宛先で受信されたメッセージは、キューからMESSAGEフレームとしてクライアントに配信されます。SUBSCRIBEフレームには、次のヘッダーを含めることができます:

  • destination: (必須)メッセージの消費元のキューのOCID (Oracle Cloud Identifier)。オプションで、指定したチャネルまたはチャネルから消費するチャネル・フィルタを含めることができます。たとえば:

    <queue_OCID>/<channel_ID_filter>
    ノート

    フィルタリングの詳細は、メッセージの選択を参照してください。
  • id: (必須)サブスクリプションを識別します。メッセージの消費を停止するには、UNSUBSCRIBEフレームでクライアントによって同じIDが渡される必要があります。
  • ack: (必須) client-individual値のみがサポートされています。つまり、ACKフレームでは、以前に配信されたすべてのメッセージではなく、ACKフレームで指定されたメッセージのみが削除されます。
  • visibility: (オプション)消費されたメッセージがリクエストを行うクライアントに対して表示される時間の長さ。ヘッダーを省略すると、キュー・サービスはキューのデフォルトの表示タイムアウトを使用します。

エラーの場合、キュー・サービスはERRORフレームを返し、接続を終了します。

UNSUBSCRIBE

UNSUBSCRIBEフレームを使用して、STOMPクライアントがキューからのメッセージの受信を停止するようにします。フレームに次のヘッダーを追加します。

  • id: (必須)停止するサブスクリプションを識別します。このIDは、対応するSUBSCRIBEフレームで使用されました。

ACK/NACK

ACKフレームを使用して、メッセージを受信して処理した後に削除します。ACKフレームでは、idヘッダーで識別されるメッセージのみが削除されます。

NACKフレームを使用して、メッセージが正常に処理されなかったことをキューに通知します。NACKフレームを使用すると、メッセージの表示が更新され、他のコンシューマにすぐに表示されます。

プロトコルのバージョンに応じて、両方のフレームが次のヘッダーを受け入れます:

  • ID: (STOMP v1.2に必須)削除または更新するメッセージのID。
  • message-id: (STOMP v1.1または1.0に必須)削除または更新するメッセージのID。

MESSAGE

MESSAGEフレームは、サブスクリプションからSTOMPクライアントにメッセージを伝えます。MESSAGEフレームには、次のヘッダーが含まれます:

  • message-id:
    • STOMP v1.2の場合: メッセージの一意の内部識別子。デバッグの目的にのみ使用します。
    • STOMP v1.1およびv1.0の場合: ACKおよびNACKフレームで使用するメッセージのreceipt。
  • subscription: SUBSCRIBEフレームで使用されるID。
  • destination: メッセージを含むキューのOCID (Oracle Cloud Identifier)と、指定したチャネルに公開するオプションのチャネルID。たとえば:
    <queue_OCID>/<channel_ID>
  • ack: STOMP v.1.2の場合のみ、メッセージのreceipt。
  • content-type: ペイロードのタイプ(この場合はplain/text)。
  • content-length: ペイロードまたはメッセージの長さ。
  • expire-after: メッセージの有効期限(ミリ秒/Epoch以降)。
  • visible-after: メッセージ表示時間(ミリ秒/Epoch以降)。
  • delivery-count: このメッセージが配信された回数
  • oci-message-id: 内部メッセージID。

MESSAGEフレームには、メッセージのペイロードがフレームの本文として含まれます。

RECEIPT

キュー・サービスは、receiptをリクエストしたSENDフレームをサービスが正常に処理した後、STOMPクライアントにRECEIPTフレームを送信します。RECEIPTフレームには、SENDフレームのreceiptヘッダーに一致する値を持つreceipt-idヘッダーが含まれます。

RECEIPTフレームは、対応するクライアント・フレームがサーバーによって処理されたという確認応答です。STOMPはストリームベースであるため、受信は以前のすべてのフレームがサーバーによって受信されたという累積確認応答でもあります。ただし、これらの以前のフレームはまだ完全には処理されていない可能性があります。クライアントが切断した場合、以前に受信したフレームは引き続きサーバーによって処理されます。

DISCONNECT

DISCONNECTフレームを使用して切断(キュー・サービスへの接続を終了)します。接続に関連付けられているすべてのサブスクリプションが停止されます。フレームには、次のヘッダーを含めることができます:

  • receipt: (オプション)キューは、receiptヘッダーを含む以前のすべてのフレームが正常に処理された後に、STOMPクライアントにRECEIPTフレームを送信します。正常な切断には、receiptヘッダーを使用します。

ERROR

キューは、何か問題が発生した場合に、ERRORフレームを送信することがあります。ERRORフレームを送信した後、キューは接続を終了します。ERRORフレームには、次のヘッダーを含めることができます:

  • message: エラーの概略。本文にはより詳細な情報が含まれています。
  • receipt-id: エラーの原因となったフレームにreceiptヘッダーが含まれていた場合のreceiptヘッダーの値。
  • content-type: 本文にエラー・メッセージの詳細が含まれる場合のペイロードのタイプ。
  • content-length: ペイロードの長さまたはエラー・メッセージの詳細。

ERRORフレーム本文には、エラーに関する詳細情報が含まれています。