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`?