Service Broker 101 Lesson 4: All about Queues
So far, this series has covered what service broker is, the different components that make it up, and how we use these to open a conversation and send a message to a queue. We’ve talked about queues quite a bit in these sessions, but never really gone into detail about what they are, so that is what this lesson is all about.
Retrieving data from Queues
A queue is a full database object, like a table or a stored procedure. As such, it is part of a schema, and appears in the sys.objects
view. A queue holds messages that have been sent to it, in the same way that a table does, and these messages can even be queried in the same way that you would query a table.
You can’t change the columns that are available, and there are quite a few of them. To see what there is, just run SELECT *
against any queue, but a few of the key ones are service_name, service_contract_name, message_type_name, message_body, message_enqueue_time, conversation_handle.
You can also retrieve data from a queue using a RECEIVE
statement. These work very much like SELECT
s, except that they remove the received message from the queue. This is how you would typically process messages, to make sure that the queue does not grow too large. Also note that the RECEIVE
statement, like a CTE, needs the previous statement to terminate with a ;
RECEIVE TOP (1)
priority
, conversation_handle
, message_type_name
, CAST(message_body AS XML) AS XMLMessageBody
, message_body
FROM dbo.TargetQueue

As you can see, you need to convert the message_body to XML or a string data type for it to make any sense. When you specify a TOP (X)
in your RECEIVE
statement, you will get the top X messages in the order they arrived (oldest first). You can also filter RECEIVE
statements, but only on conversation_handle or conversation_group_id.
Creating queues
Queues can be a bit more complex to create, and there’s a few things you need to be aware of. The basic queue creation is pretty simple
CREATE QUEUE dbo.TargetQueue
But there are a few more options than we’ve seen for the other components we’ve created. Note that queues cannot use the CREATE OR ALTER
script that was brought in for SQL 2016.
CREATE QUEUE dbo.TargetQueue
WITH
STATUS = ON
, RETENTION = OFF
, ACTIVATION
(
STATUS = ON
, PROCEDURE_NAME = dbo.TargetQueueProcedure
, MAX_QUEUE_READERS = 4
, EXECUTE AS SELF
)
, POISON_MESSAGE_HANDLING (STATUS = ON)
Everything in the WITH
block can be changed with an ALTER QUEUE
statement.
STATUS – This effectively says if the queue is active or not, so whether it can send and receive messages or not. The default is ON
RETENTION – If this is on, messages on the queue are kept until the end of a conversation regardless of if they have been RECEIVE
d or not. It defaults to OFF
ACTIVATION – This allows you to attach a stored procedure to the queue, that will handle messages as they arrive. This is the subject of the next lesson, so I won’t say anything more about it here.
POISON_MESSAGE_HANDLING – This relates to the ACTIVATION
section, so I will cover it next lesson.
All of these settings can be changed once the queue is created, using ALTER QUEUE
. That’s pretty much all there is to queues, next lesson will dive deeper into the stored procedures we attach to them and how they work.
Trackbacks & Pingbacks