knowledgeseeker
knowledgeseeker

Reputation: 1203

C# AWS SQS Read all messages without deleting

I want to read all messages from queue in AWS SQS without deleting them , using C# , but I am only getting the single last message.

Here is the code

 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());
        }

Upvotes: 5

Views: 12668

Answers (2)

tster
tster

Reputation: 18237

You are calling receive message multiple times and thus are not seeing some of your messages. Change your code to something like this:

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);
    }

}

NOTE: If there are enough messages in the queue (the number depends on the queue and is not documented), you will not be able to receive any more because you will reach your maximum number of in-flight messages.

Another NOTE: If this runs longer than your visibility timeout you will start receiving the same messages again.

Upvotes: 1

E.J. Brennan
E.J. Brennan

Reputation: 46859

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.

Upvotes: 8

Related Questions