Service Broker получает только одно сообщение за раз

#tsql #sql-server-2008 #service-broker

#tsql #sql-server-2008 #service-broker

Вопрос:

Даже когда я указываю Receive Top (25) и т.д., Я получаю только одно сообщение для удаления из очереди за раз. Не уверен, что я делаю неправильно внутри моего sproc? Возможно, что-то тривиальное, но я не вижу проблемы.

Sproc:

 CREATE PROCEDURE dbo.SPP_DEQUEUE_MESSAGE

AS

BEGIN

DECLARE @receiveTable TABLE(
message_type        sysname,
message_body        xml,
message_dialog      uniqueidentifier);

    BEGIN TRANSACTION;

    WAITFOR
        ( RECEIVE TOP(25)
            message_type_name,
            message_body,
            conversation_handle  
          FROM TargetQueue1DB
            INTO @receiveTable
        ), TIMEOUT 3000;

    SELECT 
        *
    From @receiveTable;     

    Delete from @receiveTable;

COMMIT TRANSACTION;

END --End Sproc
  

Есть идеи, что я делаю не так?

Спасибо,

B

Ответ №1:

Я предполагаю, что каждое сообщение принадлежит другому разговору (и, следовательно, по умолчанию другой группе разговоров). Если это так, то это ожидаемое поведение.

Из книг онлайн — Получение (Transact-SQL):

Все сообщения, возвращаемые инструкцией RECEIVE, принадлежат к одной и той же группе разговоров

Если вы хотите получать несколько сообщений одновременно, отправьте несколько сообщений в одном разговоре или сгруппируйте несколько разговоров в одну группу разговоров на принимающей стороне.

Комментарии:

1. Спасибо, Павел, я посмотрю на это. Я не видел эту часть… вероятно, именно это и происходит.

2. Не могли бы вы, пожалуйста, привести какой-либо пример по этому поводу? Мы отправляем сообщения из триггера вставки таблицы, и поэтому должны создавать отдельный диалог для каждой вставки. Я хотел бы получать все возможные сообщения в пакете, но этого не происходит, и я не вижу, как переместить разговоры в одну группу (даже используя С RELATED_CONVERSATION_GROUP в диалоговом окне «НАЧАТЬ»)

Ответ №2:

Знаете ли вы, сколько сообщений находится в этой очереди до запуска процедуры?

Если вы запустите следующий запрос, чтобы получить количество во всех ваших очередях

ВЫБЕРИТЕ sq.name , p.строки ИЗ sys.service_queues sq Присоединяются к sys.internal_tables it НА sq.object_id = it.parent_id И it.parent_minor_id = 0 И it.internal_type = 201 Присоединяются к sys.indexes как i на i.object_id = it.object_id и i.index_id = 1 Присоединяются к sys.partitions как p на p.object_id = i.object_id и p.index_id = i .index_id ГДЕ sq.object_id = it.parent_id И it.parent_minor_id = 0 И it.internal_type = 201

Если в этой очереди более 1 сообщения, вы должны получить больше 1 при получении.

Комментарии:

1. В очереди находится более одного сообщения