102: メッセージを送信・取得・削除する
Producerが送信したメッセージをConsumerが取得し、処理済みのreceiptを使って削除する基本フローを体験します。
所要時間 : 約30分
前提条件 : 101章のqueue-tutorial-basicがアクティブであり、Cloud ShellでOCI CLIを実行できること
目次:
- キュー詳細でメッセージの送信を選択し、
{"event":"tutorial","sequence":1}を入力します。
- メッセージの送信をクリックします。
- 期待結果: 送信成功が表示されます。
- 失敗時確認:
queue-push相当の権限とメッセージ・エンドポイントへの到達性を確認します。
- Cloud Shellを開き、キュー詳細に表示されるキューOCIDとメッセージ・エンドポイントをシェル変数へ一時的に設定します。値を履歴や共有ファイルへ保存しないでください。
QUEUE_ID='<キューOCID>'
QUEUE_ENDPOINT='<メッセージ・エンドポイント>'
Queueのメッセージ操作では、管理APIの既定エンドポイントではなく、キュー詳細に表示されるメッセージ・エンドポイントを使用します。
- Cloud Shellで1件取得します。
oci queue messages get-messages \
--endpoint "$QUEUE_ENDPOINT" \
--queue-id "$QUEUE_ID" \
--limit 1 \
--timeout-in-seconds 10
期待結果は、content、deliveryCount、receiptを含むレスポンスです。receiptは削除に必要な一時値であり、画面を共有する場合は隠します。
- レスポンスの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が更新されていないかを確認します。
同じコマンドでもう一度取得します。長期ポーリングを避ける場合は--timeout-in-seconds 0を指定します。
削除完了の確認ポイント
messagesが空の配列であれば、対象メッセージは返っていません。スクリーンショットの代わりに、次の出力と照合します。
{
"data": {
"messages": []
}
}
messagesに別のメッセージが表示された場合は、contentとidを確認し、削除対象と区別します。
- コンソールのポーリングも配信回数を増やすため、意図しない再試行に注意します。
NotAuthorizedOrNotFoundの場合は、--endpointへメッセージ・エンドポイントを指定したか、対象リージョン、キューOCID、queue-pull権限を確認します。- メッセージが見えない場合は可視性タイムアウトが終わるまで待つか、別メッセージでやり直します。
本章のメッセージは手順内で削除済みです。キューは後続章のため保持します。