#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. В очереди находится более одного сообщения