2017-02-03 5 views
0

У меня есть 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 

ответ

3

Разговор в службы брокера ничего идентифицируется тем же разговор ручки. Итак, что такое дескриптор беседы? При открытии окна диалога, вы выдаете заявление так:

declare @ch uniqueidentifier; 
begin dialog @ch 
    from service [foo] 
    to service 'bar' 
    on contract [YourContract]; 

В этом примере @ch является разговор ручка. Любые сообщения, отправляемые между инициатором и целью (и наоборот) для этого разговора, будут использовать этот идентификатор. И инициатор, и цель могут отправлять столько сообщений, сколько они хотят (то есть, это не ограничивается парадигмой «один запрос/один ответ»).

Сопряжение цитаты из документации со следующей строкой из той же документации:

После завершения разговора, приложение больше не может отправлять или получать сообщения для этого разговора.

Это означает, что для этой стороны разговора все действия считаются выполненными. В результате все сообщения, оставшиеся в очереди для этого разговора, отбрасываются. Когда выдается заявка END CONVERSATION, сообщение отправляется в очередь для обработки другой стороны. Но он будет обрабатывать его в порядке получения. То есть, если на другой стороне диалогового окна имеется большое количество сообщений, они будут обрабатываться до тех пор, пока не будет обработано сообщение о конце диалога.