4

C# を使用して、削除せずに AWS SQS のキューからすべてのメッセージを読み取りたいのですが、最後のメッセージを 1 つしか取得していません。

ここにコードがあります

 ReceiveMessageRequest rmr = new ReceiveMessageRequest();
        rmr.QueueUrl = url;
        rmr.MaxNumberOfMessages = 10;
        AmazonSQSClient sq = new AmazonSQSClient("xx", "yy");
        ReceiveMessageResponse rmrep = sq.ReceiveMessage(rmr);
        ReceiveMessageResult rmres = rmrep.ReceiveMessageResult;
        //DeleteMessageRequest dmr = new DeleteMessageRequest();

        string msgid = "";
        string rephandle = "";
        XmlDocument xl = new XmlDocument();

        for (int i = 0; i < rmres.Message.Count;i++ )
        {
            rmrep = sq.ReceiveMessage(rmr);
            rmres = rmrep.ReceiveMessageResult;
            object y = JsonConvert.DeserializeObject<object>(rmres.Message[0].Body);
           int z= y.add();
           MessageBox.Show(z.ToString());
        }
4

2 に答える 2

8

A queue is not a database table; you can't just 'read all the messages'. You tell SQS you want some messages, it picks some and sends them to you; you can't ask it, or expect it, to iterate thru a unique list of messages in the queue and present them to you, it is not intended for that purpose.

If you read 1 or messages, and delete them (or put them in another queue), then eventually you can 'read all the messages', but as long as you don't delete any, its likely that you will keep getting served back some messages multiple times.

于 2013-10-25T00:12:15.463 に答える
1

メッセージの受信を複数回呼び出しているため、一部のメッセージが表示されません。コードを次のように変更します。

AmazonSQSClient sq = new AmazonSQSClient("xx", "yy");
while (true)
{
    ReceiveMessageRequest rmr = new ReceiveMessageRequest();
    rmr.QueueUrl = url;
    rmr.MaxNumberOfMessages = 10;
    ReceiveMessageResponse response= sq.ReceiveMessage(rmr);

    foreach (Message message in response.ReceiveMessageResult.Message)
    {
        MessageBox.Show(message.ReceiptHandle + ": " + message.Body);
    }

}

注: キューに十分な数のメッセージがある場合 (数はキューによって異なり、文書化されていません)、処理中のメッセージの最大数に達するため、それ以上受信できなくなります。

別の注意: これが表示タイムアウトよりも長く実行されると、同じメッセージを再び受信し始めます。

于 2013-11-08T23:05:25.897 に答える