Wir hatten eine ähnliche Aufgabe in meiner Firma und herausgefunden, eine optimale Lösung war die Verwendung von asynchronen Auslösern mit externen Aktivator, der Webservices von .NET aufruft und Nachrichten nach erfolgreichem Aufruf aus der Warteschlange löscht. Mit dieser Maßnahme erstellen Sie einen regulären Datenbanktrigger, der eine Nachricht zur asynchronen Verarbeitung an die Service Broker-Warteschlange sendet. AKA Asynchroner Trigger. Hier ist ein Beispiel aus dem Kapitel 10 des Klause 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);
Stattdessen gespeicherte Prozeduren zu verwenden, die Web-Services durch verwalteten Code nennen würde (interne Aktivierung) haben wir beschlossen, dass es besser ist, dass die Verarbeitung außerhalb von SQL Server auszulagern. Und dieses nette kleine Tool von Microsoft - External Activator gefunden, die auf die Aktivierungswarteschlange hören und eine Anwendung starten, wenn eine neue Nachricht in der Warteschlange ist. Zur Umsetzung lesen Sie bitte Klaus's Kapitel 4 im Buch.
Hallo, Vielen Dank für Ihre Notizen. Ich schaute auf das Beispiel. Es geht um den Aufruf einer Web-Service innerhalb der Service-Broker-Infrastruktur. Was ich wirklich brauche, ist etwa folgendes: Zeile eingefügt/in Tabelle aktualisiert -> Trigger einfügen/aktualisieren -> Trigger schreibt Nachricht in die Service Broker-Warteschlange -> Stored Proc aktiviert von SQL Server -> gespeicherte Proc-Aufrufe Web-Service -> Die Konversation endet. Irgendeine Idee? Sqlbs – user409679