Quantcast
Channel: Service Bus forum
Viewing all articles
Browse latest Browse all 1916

Service Bus Session ReceiveBatchAsync only receiving 1 message

$
0
0

Originally posted http://stackoverflow.com/questions/35187172/service-bus-session-receivebatchasync-only-receiving-1-message

I'm using a Service Bus queue with Sessions enabled and I'm sending 5 messages with the same SessionId. My receiving code uses `AcceptMessageSessionAsync` to get a session lock so that it will receive all the messages for that session. It then uses `session.ReceiveBatchAsync` to try and get all the messages for the session. However, it only seems to get the first message, then when another attempt is made, it gets all the others. You should be able to see that there is a gap of almost a minute between the two batches even though all these messages were sent at once: 

    Session started:AE8DC914-8693-4110-8BAE-244E42A302D5
    Message received:AE8DC914-8693-4110-8BAE-244E42A302D5_1_08:03:03.36523
    Session started:AE8DC914-8693-4110-8BAE-244E42A302D5
    Message received:AE8DC914-8693-4110-8BAE-244E42A302D5_2_08:03:04.22964
    Message received:AE8DC914-8693-4110-8BAE-244E42A302D5_3_08:03:04.29515
    Message received:AE8DC914-8693-4110-8BAE-244E42A302D5_4_08:03:04.33959
    Message received:AE8DC914-8693-4110-8BAE-244E42A302D5_5_08:03:04.39587

My code to process these is a function in a WebJob:

    [NoAutomaticTrigger]    public static async Task MessageHandlingLoop(TextWriter log, CancellationToken cancellationToken)    {        var connectionString = ConfigurationManager.ConnectionStrings["ServiceBusListen"].ConnectionString;        var client = QueueClient.CreateFromConnectionString(connectionString, "myqueue");        while (!cancellationToken.IsCancellationRequested)        {            MessageSession session = null;            try            {                session = await client.AcceptMessageSessionAsync(TimeSpan.FromMinutes(1));                log.WriteLine("Session started:" + session.SessionId);                foreach (var msg in await session.ReceiveBatchAsync(100, TimeSpan.FromSeconds(5)))                {                    log.WriteLine("Message received:" + msg.MessageId);                    msg.Complete();                }            }            catch (TimeoutException)            {                log.WriteLine("Timeout occurred");                await Task.Delay(5000, cancellationToken);            }            catch (Exception ex)            {                log.WriteLine("Error:" + ex);            }        }    }

This is called from my WebJob `Main` using:

    JobHost host = new JobHost();
    host.Start();
    var task = host.CallAsync(typeof(Functions).GetMethod("MessageHandlingLoop"));
    task.Wait();
    host.Stop();

Why don't I get all my messages in the first call of `ReceiveBatchAsync`?



Viewing all articles
Browse latest Browse all 1916

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>