У меня есть ServiceBroker для SQL Server. Инициатор отправителя находится в триггере на INSERT
на столе. Его можно вызвать очень часто и может произойти несколько раз во время чтения/обработки цели сообщения.Если my ServiceBroker нацеливает «прослушиватель», вызывает завершение разговора, удаляет ли оно все сообщения, добавленные с момента его получения?
В документации Microsoft, говорится:
Когда разговор заканчивается, Service Broker удаляет все сообщения, для разговора из очереди службы.
https://msdn.microsoft.com/en-us/library/ms177521.aspx
Что это считают "разговор"? Это просто одно сообщение? Или, если триггер снова вызван, прежде чем цель завершит разговор и добавит другое сообщение, будет ли это сообщение также удалено?
Target работает как:
CREATE PROCEDURE [dbo].[MyTypeProcessed]
AS
DECLARE @ConversationHandle UNIQUEIDENTIFIER
DECLARE @MessageType NVARCHAR(256)
DECLARE @MessageBody XML
DECLARE @ResponseMessage XML
DECLARE @strMessageBody NVARCHAR(MAX)
WHILE(1=1)
BEGIN
BEGIN TRY
WAITFOR(RECEIVE TOP(1)
@ConversationHandle = conversation_handle,
@MessageType = message_type_name,
@MessageBody = CAST(message_body AS XML)
FROM
MyTypeTargetQueue
), TIMEOUT 1000
IF(@@ROWCOUNT=0)
BEGIN
RETURN
END
SELECT @MessageType
IF @MessageType = 'MyTypeRequest'
BEGIN
SET @strMessageBody = cast(@MessageBody as nvarchar(Max));
EXEC SP_HandleMessage @strMessageBody
--Close the conversation on the Payment Service
END CONVERSATION @ConversationHandle
END
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE()
END CATCH
END
GO