現在、Amazon の SQS を使用していますが、現在「処理中」のキュー メッセージを削除しようとすると問題が発生します。
以下にコード例を示します。
ReceiveMessageRequest queueRequest = new ReceiveMessageRequest();
queueRequest.WithMaxNumberOfMessages(1);
queueRequest.WithQueueUrl(config.QueueURL);
queueRequest.WithAttributeName("All");
ReceiveMessageResponse response = sqs.ReceiveMessage(queueRequest);
if (response.IsSetReceiveMessageResult())
{
ReceiveMessageResult result = response.ReceiveMessageResult;
if (result.IsSetMessage())
{
if (result.Message.First() != null)
{
return new Tuple<string, string, bool>(result.Message.First().ReceiptHandle, result.Message.First().Body ?? null, false);
}
}
}
ハンドルとメッセージ本文の両方を受信したら、受信ハンドル文字列をクラウド ストレージ (DynamoDB など) に保存します。その後、ストレージ サービスからハンドルをロードし、次のような内容で削除を呼び出します。
sqs.DeleteMessage(new DeleteMessageRequest() { QueueUrl = "urL", ReceiptHandle = handle });
ただし、その行を実行すると、「入力レシート ハンドルが無効です」というエラー メッセージが表示されます。
このメッセージが再受信されていないことはわかっているため、ログに記録されている受信ハンドルは最新のものである必要があります。また、メッセージを受信した後にスリープ状態にしてから、上記のように削除しようとするだけで、同じアプリケーション内でメッセージを削除できることにも注意してください。
何か案は?