Getting Filtered Azure Service Bus Queue Descriptions
The Azure C# SDK contains the NamespaceManager.GetQueues method to receive a list of all the queues in your Azure Service Bus namespace. This is great if you’ve just got a few queues, but if you have hundreds or even thousands, you might want to filter them.
The good news is that there’s an overload of GetQueues that takes a filter string. The bad news is that the MSDN documentation gives you no clues whatsoever as to what you’re supposed to put in that string.
So after a lot of guesswork, googling and experimentation, here’s what I’ve worked out.
Filter by Queue Name
To get all the queues that start with a particular prefix, you can use the startswith
method, and check that it returns true:
var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);
var myQueues = namespaceManager.GetQueues("startswith(path, 'mheath') eq true");
I did experiment to see if there also were methods available like endswith
, contains
or substringof
, but couldn’t get anything to work.
Filter by Message Count
You can also query for all queues based on their message count (which includes the number of dead-lettered messages). Here we’re looking for queues with over 1000 messages. The queue objects themselves are instances of QueueDescription which has a MessageCountDetails property which allows you to see the breakdown of messages by type (active, dead-letter, scheduled etc).
var backedUpQueues = namespaceManager.GetQueues("messageCount Gt 1000");
Filter by Date
Finally you can query for all queues by their created date, or last accessed or updated date. Here’s a query for inactive queues that haven’t been accessed in the past few months:
namespaceManager.GetQueues("AccessedAt Lt '2016-06-01T00:00:00Z'")
What about Topics and Subscriptions?
NamespaceManager
has GetTopics and GetSubscriptions method which also take filter strings, so you should be able to apply the same operators to get filtered topics and subscriptions.
Comments
How did you figure this out ? Will it work the same for Java SDK ?
Sharad HolaniAnd what is that "path" literal in the string ?
Could you please explain a little about how to set the filters for name correctly ?
yeah, as I said it was "guesswork, googling and experimentation" to work out these paths. There were a few sample apps I found that gave clues. The syntax will be same for Java SDK - it's just making REST calls under the hood. The "path" just means the queue/topic name
Mark HeathOk. So for Java , I used -> ("startsWith(path,'test') eq true").
Sharad HolaniReally horrible to have no documentation for this.
Amazed at how you figured this out.