2016-09-12 3 views
2

ich eine gespeicherte Prozedur zu schreiben, die die folgenden Vorgänge durchführen würde:Service Broker-Nachrichten innerhalb einer Transaktion

  1. BEGIN eine Transaktion
  2. führen einige Aufgaben
  3. Verwendung Service Broker Kick-off einen Hintergrundprozess
  4. warten auf eine Antwortnachricht (mit Auftragsstatus) von Service Broker
  5. oder ROLLBACK-Transaktion COMMIT auf der Antwortnachricht in Abhängigkeit

Das Problem ist, dass Service-Broker der Kommunikation nicht innerhalb einer TRANSACTION arbeitet:

  • die Nachrichtenwarteschlange hat Aktivierung aktiviert, aber die zugehörige gespeicherte Prozedur ist nicht ausgeführt (PRINT-Anweisungen in der gespeicherten Prozedur sind Datei)
  • RECEIVE Befehl Zeiten ERRORLOG aus

Hier ist ein Auszug aus meinen Co nicht geschrieben de:

-- Comment out the following line to make everything work 
begin tran t1 

DECLARE @Update_Msg XML([sb].[Service_Broker_xxx_Schemas]) = ' 
<Request xmlns="xxx"> 
    <Table xmlns="xxx"> 
    <Fields> 
     xxx 
    </Fields> 
    </Table> 
    <Requested_By>xxx</Requested_By> 
</Request>' 

DECLARE @conversation_handle UNIQUEIDENTIFIER 
      ,@message_body varbinary(max) 
      ,@message_type_name nvarchar(256) 
      ,@timestamp datetime2 

     BEGIN DIALOG CONVERSATION @conversation_handle 
     FROM SERVICE [xxx_Initiating_Service] 
     TO SERVICE 'xxx_Target_Service' 
     ON CONTRACT xxx_Contract 
     WITH ENCRYPTION = OFF; 

     SEND ON CONVERSATION @conversation_handle 
     MESSAGE TYPE [xxx_Command](@Update_Msg); 


select * from sys.transmission_queue with(nolock) 
--PRINT @conversation_handle 

WAITFOR (
    -- just handle one message at a time 
    RECEIVE TOP(1) @conversation_handle = conversation_handle  -- the identifier of the dialog this message was received on 
        ,@message_type_name = message_type_name 
        ,@message_body=message_body      -- the message contents 
        ,@timestamp = GETDATE() 
        FROM [sb].[xxx_Initiator_Queue] 
        WHERE conversation_handle = @conversation_handle 
), TIMEOUT 1000 -- if the queue is empty for one second, give UPDATE and go away 
IF @@ROWCOUNT > 0 
BEGIN 
     SELECT @@ROWCOUNT, @message_type_name, CONVERT(XML, @message_body) 
     END CONVERSATION @conversation_handle; 
END 
ELSE 
BEGIN 
    PRINT 'Did not receive any response from Service Broker.' 
END 

-- Comment out the following line to make everything work 
commit tran t1 

Welcher Art ist die Implementierung von Service Broker-Nachrichten innerhalb einer Transaktion?

Antwort

4

Das Senden von Nachrichten über Service Broker ist transaktional. Das heißt, wenn Sie begin tran; send; tun, wird die Nachricht nicht wirklich gesendet, bis Sie commit.

Verwandte Themen