4

現在、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 });

ただし、その行を実行すると、「入力レシート ハンドルが無効です」というエラー メッセージが表示されます。

このメッセージが再受信されていないことはわかっているため、ログに記録されている受信ハンドルは最新のものである必要があります。また、メッセージを受信した後にスリープ状態にしてから、上記のように削除しようとするだけで、同じアプリケーション内でメッセージを削除できることにも注意してください。

何か案は?

4

3 に答える 3

3

両方の操作 (ReceiveMessage と DeleteMessage) を実行しているときに、キューを参照するまったく同じ URL を使用していることを確認してください。

于 2015-04-01T17:26:54.370 に答える
2

メッセージに再び対処するには、メッセージの VisibilityTimeout が期限切れになるまで待つ必要があります。これにより、そのメッセージを処理するマシンは、必要なことを何でも行う時間を得ることができます。

于 2012-10-05T08:52:54.857 に答える