Lezione 2: Creazione di una procedura ad attivazione interna
In questa lezione verranno descritte le procedure per creare una stored procedure per l'elaborazione di messaggi provenienti da una coda di Service Broker. Verrà inoltre descritto come specificare che la procedura deve essere attivata ogni volta che sono presenti messaggi nella coda.
Procedure
Passaggio al database AdventureWorks
Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice per cambiare contesto passando al database AdventureWorks.
USE AdventureWorks; GO
Creazione di una stored procedure di attivazione interna
Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per creare una stored procedure. Quando viene eseguita, la stored procedure riceve messaggi fino a quando nella coda sono presenti messaggi. Se si verifica un timeout di ricezione senza restituzione di messaggi, la stored procedure viene terminata. Se il messaggio ricevuto è un messaggio di richiesta, la stored procedure restituisce un messaggio di risposta. Se il messaggio ricevuto è di tipo EndDialog, la stored procedure termina il lato di destinazione della conversazione. Se il messaggio ricevuto è di tipo Error, viene eseguito il rollback della transazione.
CREATE PROCEDURE TargetActivProc AS DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; DECLARE @RecvReqMsg NVARCHAR(100); DECLARE @RecvReqMsgName sysname; WHILE (1=1) BEGIN BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueueIntAct ), TIMEOUT 5000; IF (@@ROWCOUNT = 0) BEGIN ROLLBACK TRANSACTION; BREAK; END IF @RecvReqMsgName = N'//AWDB/InternalAct/RequestMessage' BEGIN DECLARE @ReplyMsg NVARCHAR(100); SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>'; SEND ON CONVERSATION @RecvReqDlgHandle MESSAGE TYPE [//AWDB/InternalAct/ReplyMessage] (@ReplyMsg); END ELSE IF @RecvReqMsgName = N'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' BEGIN END CONVERSATION @RecvReqDlgHandle; END ELSE IF @RecvReqMsgName = N'https://schemas.microsoft.com/SQL/ServiceBroker/Error' BEGIN END CONVERSATION @RecvReqDlgHandle; END COMMIT TRANSACTION; END GO
Modifica della coda di destinazione per specificare l'attivazione interna
Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per specificare che Service Broker deve attivare la stored procedure TargetActiveProc per elaborare i messaggi provenienti da TargetQueueIntAct. Service Broker eseguirà una copia di TargetActiveProc ogni volta che viene ricevuto un messaggio in TargetQueueIntAct, purché nessuna copia della procedura sia già in esecuzione. Service Broker aggiungerà quindi altre copie di TargetActiveProc ogni volta che le copie esistenti non riescono a gestire il numero di messaggi in arrivo.
ALTER QUEUE TargetQueueIntAct WITH ACTIVATION ( STATUS = ON, PROCEDURE_NAME = TargetActivProc, MAX_QUEUE_READERS = 10, EXECUTE AS SELF ); GO
Passaggi successivi
È stato configurato correttamente AdventureWorks per supportare una conversazione tra //AWDB/InternalAct/InitiatorService e //AWDB/InternalAct/TargetService. Nel passaggio successivo si completerà una conversazione tramite la configurazione. Vedere Lezione 3: Inizio di una conversazione e trasmissione di messaggi.
Vedere anche