C#AWS SQS读取所有邮件而不删除

时间:2013-10-24 14:34:37

标签: c# amazon-web-services amazon-sqs

我希望使用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());
        }

2 个答案:

答案 0 :(得分:6)

队列不是数据库表;你不能只是'阅读所有的消息'。你告诉SQS你想要一些消息,它会挑选一些并发送给你;你不能要求它或期望它通过队列中的唯一消息列表进行迭代并将它们呈现给你,它不是为了那个目的。

如果您阅读1或消息,并删除它们(或将它们放在另一个队列中),那么最终您可以“读取所有消息”,但只要您不删除任何消息,它可能会保留多次收回一些邮件。

答案 1 :(得分: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);
    }

}

注意:如果队列中有足够的消息(号码取决于队列而未记录),您将无法再接收,因为您将达到最大的飞行中消息数。

另一个注意:如果此时间超过您的可见性超时,您将再次开始接收相同的消息。