In this post. I documented how to create a new application using Azure Service Bus and add a message to the queue. In this post, I’ll cover how to read that post from the queue, and how to deal with acknowledging the receipt.
The Code
The code from this post can be found here.
The code uses a lot of hard coded strings and static methods, and this is because it makes it easier to see exactly what it happening and when. This is not intended as an example of production code, more as a cut-and-paste repository.
Reading a Message
Most of the code that we’ve written can simply be re-hashed for the receipt. First, initialise the queue as before:
Uri uri = ServiceManagementHelper.GetServiceUri();
TokenProvider tokenProvider = ServiceManagementHelper.GetTokenProvider(uri);
NamespaceManager nm = new NamespaceManager(uri, tokenProvider);
if (!nm.QueueExists("TestQueue")) return;
Obviously, if the queue doesn’t exist for reading, there’s limited point in creating it. The next step is to set-up a queue client:
string connectionString = GetConnectionString();
QueueClient queueClient = QueueClient.CreateFromConnectionString(connectionString, queueName);
return queueClient;
The connection string is found here:
Finally, ask for the next message:
BrokeredMessage message = queueClient.Receive();
string messageBody = message.GetBody<string>();
Console.WriteLine($"Message received: {messageBody}");
And we can see the contents of the queue:
If we run again:
We can see that, despite being read, the message is still sat in the queue:
Acknowledging the Message
To explicitly acknowledge a message, just calling the Complete method on the message object will work:
BrokeredMessage message = queueClient.Receive();
string messageBody = message.GetBody<string>();
message.Complete();
Console.WriteLine($"Message received: {messageBody}");
And the message is gone:
Summary and Cost
We now have a basic, working, message queue. But one thing that I always worry about with Azure is how much this costs. Let’s run a send and receive for 100 messages with the content: “test” as above.
The first thing is to change the code slightly so that it reads through all messages (not just the first):
while (true)
{
string message = ReadMessage("TestQueue");
if (string.IsNullOrWhiteSpace(message)) break;
Console.WriteLine($"Message received: {message}");
}
private static string ReadMessage(string queueName)
{
QueueClient client = QueueManagementHelper.GetQueueClient(queueName);
BrokeredMessage message = client.Receive();
if (message == null) return string.Empty;
string messageBody = message.GetBody<string>();
message.Complete();
return messageBody;
}
Then run this to clear the queue. By default, client.Receive has a default timeout, so it will pause for a few seconds before returning if there are no messages. This timeout is a very useful feature. Most of this post was written on a train with a flaky internet connection, and this mechanism provided a resilient way to allow communications to continue when the connection was available.
And change the send code:
string message = Console.ReadLine();
for (int i = 1; i <= 100; i++)
{
AddNewMessage("1", message, "TestQueue");
}
Next, the current credit on my account:
Let’s run 100 messages:
That looks familiar. Let’s try 10,000:
I’ve added some times to this, too. It’s processing around 10 / second - which is not astoundingly quick. It’s worth mentioning again that this post was written largely on a train, but still, 10 messages per second means that 10K messages will take around 15 mins. It is faster when you have a reliable (non-mobile) internet connection, but still. Anyway, back to cost. 10K messages still showed up as a zero cost.
But, Azure is a paid service, so this has to start costing money. This time, I’m adding 1000 character string to send as a message, and sending that 100,000 times.
After this, the balance was the same; however, the following day, it dropped slightly to £36.94. So, as far as I can tell, the balance is updated based on some kind of job that runs each day (which means that the balance might not be updated in real-time).
I asked this question here.
The published pricing details are here, but it looks like you should be able to post around 500,000 messages before you start incurring cost (1M operations).
References
https://insidethecpu.com/2015/11/06/levaraging-azure-service-bus-with-c/
https://msdn.microsoft.com/en-gb/library/hh868041.aspx?f=255&MSPPError=-2147217396
https://stackoverflow.com/questions/14831281/how-does-the-service-bus-queueclient-receive-work