Я хочу соблюдать метод повторного использования диалогов Ремуса Русану в своей реализации SSB. Я написал некоторую процедуру активации для очереди инициатора, чтобы перехватить сообщение EndDialog обратно от цели и очистить таблицу Dialog от дескриптора закрытого диалога.
Тем не менее, хотя подтверждение EndDialog правильно достигает стороны инициатора, активация не запускается, поэтому мой обработчик сообщений не может работать и очищать место.
CREATE PROCEDURE fdwh.ProcessResponse
AS
BEGIN
DECLARE @dlgId UNIQUEIDENTIFIER;
DECLARE @msgTypeName SYSNAME;
DECLARE @msgBody VARBINARY(MAX);
DECLARE @payloadHistoryId INT;
BEGIN TRY
BEGIN TRANSACTION
WAITFOR(
RECEIVE TOP(1)
@dlgId = [conversation_handle],
@msgTypeName = message_type_name,
@msgBody = message_body
FROM [fdwh].[SenderQueue]), TIMEOUT 10;
-- Message is regular end of conversation, terminate it
IF (@msgTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog')
BEGIN
END CONVERSATION @dlgId;
DELETE FROM DWH_BOARD.dbo.Dialog
WHERE (DbId = DB_ID()) AND
(DialogId = @dlgId);
END
-- Message is error, extracts and logs number and description
IF (@msgTypeName = N'http://schemas.microsoft.com/SQL/ServiceBroker/Error')
BEGIN
[...]
Я ожидаю, что активация очереди будет запущена и http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog также должно быть обработано, но это не так. Разве EndDialog ACK не является обычным сообщением?
Ниже приведен скриншот трассировки Profiler, который не требует пояснений: .
Пример чисто локальный (один экземпляр/две БД).
Спасибо,
Обновление Еще несколько показателей для сбойной очереди: `SELECT que.[имя], que.is_activation_enabled, que.is_receive_enabled, que.is_poison_message_handling_enabled, que.activation_procedure, que.max_readers, [execute_as] = (SELECT pri.[имя] ОТ sys.database_principals pri ГДЕ pri.principal_id = que.execute_as_principal_id) ОТ sys.service_queues que ГДЕ que.[имя] = 'SenderQueue'; ИДТИ
ВЫБЕРИТЕ дескриптор_беседы, to_service_name, message_type_name, is_conversation_error, is_end_of_dialog, enqueue_time, transfer_status FROM sys.transmission_queue; ИДТИ
ВЫБЕРИТЕ [имя], is_broker_enabled, log_reuse_wait_desc FROM sys.databases WHERE database_id = 8; ИДТИ
EXEC sp_spaceused 'fdwh.SenderQueue'; ИДТИ
SELECT * FROM sys.dm_broker_activated_tasks WHERE database_id=8; ИДТИ
ВЫБЕРИТЕ [состояние], last_activated_time, tasks_waiting FROM sys.dm_broker_queue_monitors, ГДЕ database_id = 8; ВПЕРЕД `