OCIチュートリアル
タグ検索 トップページへ戻る

102: メッセージを送信・取得・削除する

タグ: #Queue

Producerが送信したメッセージをConsumerが取得し、処理済みのreceiptを使って削除する基本フローを体験します。

所要時間 : 約30分

前提条件 : 101章のqueue-tutorial-basicがアクティブであり、Cloud ShellでOCI CLIを実行できること

目次:

1. メッセージを送信する

  1. キュー詳細でメッセージの送信を選択し、{"event":"tutorial","sequence":1}を入力します。
メッセージの送信画面

  1. メッセージの送信をクリックします。
    • 期待結果: 送信成功が表示されます。
    • 失敗時確認: queue-push相当の権限とメッセージ・エンドポイントへの到達性を確認します。
メッセージの送信成功

  1. Cloud Shellを開き、キュー詳細に表示されるキューOCIDとメッセージ・エンドポイントをシェル変数へ一時的に設定します。値を履歴や共有ファイルへ保存しないでください。
QUEUE_ID='<キューOCID>'
QUEUE_ENDPOINT='<メッセージ・エンドポイント>'

Queueのメッセージ操作では、管理APIの既定エンドポイントではなく、キュー詳細に表示されるメッセージ・エンドポイントを使用します。

2. メッセージを取得・削除する

  1. Cloud Shellで1件取得します。
oci queue messages get-messages \
  --endpoint "$QUEUE_ENDPOINT" \
  --queue-id "$QUEUE_ID" \
  --limit 1 \
  --timeout-in-seconds 10

期待結果は、contentdeliveryCountreceiptを含むレスポンスです。receiptは削除に必要な一時値であり、画面を共有する場合は隠します。

Cloud Shellでのメッセージ取得結果

  1. レスポンスのreceiptを一時変数へ設定して削除します。
MESSAGE_RECEIPT='<取得結果のreceipt>'
oci queue messages delete-message \
  --endpoint "$QUEUE_ENDPOINT" \
  --queue-id "$QUEUE_ID" \
  --message-receipt "$MESSAGE_RECEIPT" \
  --force

実行結果の確認

成功時は応答本文が表示されません。エラーが表示されず、Cloud Shellのプロンプトに戻れば削除成功です。

<出力なし>

ServiceErrorが表示された場合は、receiptの期限と、同じメッセージを再取得してreceiptが更新されていないかを確認します。

3. 確認

同じコマンドでもう一度取得します。長期ポーリングを避ける場合は--timeout-in-seconds 0を指定します。

削除完了の確認ポイント

messagesが空の配列であれば、対象メッセージは返っていません。スクリーンショットの代わりに、次の出力と照合します。

{
  "data": {
    "messages": []
  }
}

messagesに別のメッセージが表示された場合は、contentidを確認し、削除対象と区別します。

4. トラブルシュート

  • コンソールのポーリングも配信回数を増やすため、意図しない再試行に注意します。
  • NotAuthorizedOrNotFoundの場合は、--endpointへメッセージ・エンドポイントを指定したか、対象リージョン、キューOCID、queue-pull権限を確認します。
  • メッセージが見えない場合は可視性タイムアウトが終わるまで待つか、別メッセージでやり直します。

5. 作成したリソースの削除

本章のメッセージは手順内で削除済みです。キューは後続章のため保持します。

参考: キューへのメッセージの公開キューからのメッセージの使用