Wir hatten eine ähnliche Aufgabe in meinem Unternehmen und fanden heraus, dass eine optimale Lösung darin bestand, asynchrone Trigger mit einem externen Aktivator zu verwenden, der Webservices von .NET aufruft und Nachrichten nach erfolgreichem Aufruf aus der Warteschlange entfernt. Das bedeutet, dass Sie einen regulären Datenbanktrigger erstellen, der eine Nachricht an die Warteschlange des Servicebrokers zur asynchronen Verarbeitung sendet. AKA Asynchronous Trigger. Hier ist ein Beispiel aus dem Kapitel 10 von Klause's Buch
-- Create the trigger written with T-SQL
CREATE TRIGGER OnCustomerInserted ON Customers FOR INSERT
AS
DECLARE @conversationHandle UNIQUEIDENTIFIER
DECLARE @fromService SYSNAME
DECLARE @toService SYSNAME
DECLARE @onContract SYSNAME
DECLARE @messageBody XML
SET @fromService = 'CustomerInsertedClient'
SET @toService = 'CustomerInsertedService'
SET @onContract = 'http://ssb.csharp.at/SSB_Book/c10/CustomerInsertContract'
-- Check if there is already an ongoing conversation with the TargetService
SELECT @conversationHandle = ConversationHandle FROM SessionConversations
WHERE SPID = @@SPID
AND FromService = @fromService
AND ToService = @toService
AND OnContract = @onContract
IF @conversationHandle IS NULL
BEGIN
-- We have to begin a new Service Broker conversation with the TargetService
BEGIN DIALOG CONVERSATION @conversationHandle
FROM SERVICE @fromService
TO SERVICE @toService
ON CONTRACT @onContract
WITH ENCRYPTION = OFF;
-- Create the dialog timer for ending the ongoing conversation
BEGIN CONVERSATION TIMER (@conversationHandle) TIMEOUT = 5;
-- Store the ongoing conversation for further use
INSERT INTO SessionConversations (SPID, FromService, ToService, OnContract, ConversationHandle)
VALUES
(
@@SPID,
@fromService,
@toService,
@onContract,
@conversationHandle
)
END
-- Construct the request message
SET @messageBody = (SELECT * FROM INSERTED FOR XML AUTO, ELEMENTS);
-- Send the message to the TargetService
;SEND ON CONVERSATION @conversationHandle
MESSAGE TYPE [http://ssb.csharp.at/SSB_Book/c10/CustomerInsertedRequestMessage] (@messageBody);
Anstatt gespeicherte Prozeduren zu verwenden, die Webdienste über verwalteten Code aufrufen würden (interne Aktivierung), haben wir beschlossen, dass es besser ist, diese Verarbeitung außerhalb des SQL-Servers zu verlagern. Und fanden dieses nette kleine Tool, das von Microsoft entwickelt wurde - Externer Aktivator die die Aktivierungswarteschlange abhört und eine Anwendung startet, wenn eine neue Nachricht in der Warteschlange steht. Zur Implementierung lesen Sie bitte Klaus' Kapitel 4 in diesem Buch.