4

我想使用 C# 从 AWS SQS 中的队列中读取所有消息而不删除它们,但我只收到最后一条消息。

这是代码

 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

队列不是数据库表;您不能只是“阅读所有消息”。您告诉 SQS 您想要一些消息,它会挑选一些并将它们发送给您;您不能要求它或期望它遍历队列中唯一的消息列表并将它们呈现给您,它不是为此目的而设计的。

如果您阅读 1 或消息,并删除它们(或将它们放在另一个队列中),那么最终您可以“阅读所有消息”,但只要您不删除任何消息,您很可能会继续得到服务一些消息多次。

于 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 回答