Lição 2: Criando um procedimento de ativação interna
Nesta lição, você aprenderá a criar um procedimento armazenado para processar mensagens de uma fila do Service Broker. Também aprenderá a especificar que o procedimento seja ativado a qualquer momento em que haja mensagens na fila.
Procedimentos
Alternar para o banco de dados AdventureWorks2008R2
Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para alternar o contexto para o banco de dados AdventureWorks2008R2.
USE AdventureWorks2008R2; GO
Crie um procedimento armazenado de ativação interna
Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para criar um procedimento armazenado. Quando executado, o procedimento armazenado mantém o recebimento mensagens enquanto há mensagens na fila. Se o tempo limite de recebimentos for alcançado sem retornar uma mensagem, o procedimento armazenado terminará. Se a mensagem recebida era uma mensagem de solicitação, o procedimento armazenado retornará uma mensagem de resposta. Se a mensagem recebida é uma mensagem EndDialog, o procedimento armazenado terminará o lado de destino da conversa. Se a mensagem recebida for uma mensagem de Erro, a transação será revertida.
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
Altere a fila de destino para especificar ativação interna
Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para especificar que o Service Broker ative o procedimento armazenado TargetActiveProc para processar mensagens de TargetQueueIntAct. O Service Broker executará uma cópia de TargetActiveProc a qualquer momento em que uma mensagem for recebida em TargetQueueIntAct e nenhuma cópia do procedimento estiver em execução. O Service Broker executará cópias adicionais de TargetActiveProc sempre que as cópias existentes não acompanharem o número de mensagens de entrada.
ALTER QUEUE TargetQueueIntAct WITH ACTIVATION ( STATUS = ON, PROCEDURE_NAME = TargetActivProc, MAX_QUEUE_READERS = 10, EXECUTE AS SELF ); GO
Próximas etapas
Você configurou com êxito o AdventureWorks2008R2 para oferecer suporte a uma conversa entre o //AWDB/InternalAct/InitiatorService e o //AWDB/InternalAct/TargetService. Em seguida, você concluirá uma conversa usando essa configuração. Consulte Lição 3: Começando uma conversa e transmitindo mensagens.
Consulte também