Lição 3: Começando uma conversa e transmitindo mensagens
Nesta lição, você aprenderá a concluir um ciclo de mensagem de resposta de solicitação simples em um sistema configurado com um procedimento armazenado de ativação interna.
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 para o contexto do banco de dados AdventureWorks2008R2.
USE AdventureWorks2008R2; GO
Iniciar uma conversa e enviar uma mensagem de solicitação
Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para iniciar uma conversa e enviar uma mensagem de solicitação para o //AWDB/InternalAct/TargetService. O código precisará ser executado em bloco único porque há uma variável que é usada para passar um identificador de caixa de diálogo da instrução BEGIN DIALOG para a instrução SEND. O lote executa a instrução BEGIN DIALOG para iniciar a conversa. Ele cria uma mensagem de solicitação e depois usa o identificador de caixa de diálogo em uma instrução SEND para enviar a mensagem de solicitação nessa conversa. A última instrução SELECT exibe o texto da mensagem enviada.
DECLARE @InitDlgHandle UNIQUEIDENTIFIER; DECLARE @RequestMsg NVARCHAR(100); BEGIN TRANSACTION; BEGIN DIALOG @InitDlgHandle FROM SERVICE [//AWDB/InternalAct/InitiatorService] TO SERVICE N'//AWDB/InternalAct/TargetService' ON CONTRACT [//AWDB/InternalAct/SampleContract] WITH ENCRYPTION = OFF; -- Send a message on the conversation SELECT @RequestMsg = N'<RequestMsg>Message for Target service.</RequestMsg>'; SEND ON CONVERSATION @InitDlgHandle MESSAGE TYPE [//AWDB/InternalAct/RequestMessage] (@RequestMsg); -- Diplay sent request. SELECT @RequestMsg AS SentRequestMsg; COMMIT TRANSACTION; GO
Receber a solicitação e enviar uma resposta
- Quando você envia a mensagem de solicitação, o Service Broker ativa uma cópia de TargetActiveProc automaticamente. O procedimento armazenado recebe a mensagem de resposta de TargetQueueIntAct e a envia de volta ao iniciador.
Receber a resposta e terminar a conversa
Copie e cole o código a seguir em uma janela do Editor de Consultas. Em seguida, execute-o para receber a mensagem de resposta e terminar a conversa. A instrução RECEIVE recupera a mensagem de resposta de InitiatorQueueIntAct. A instrução END CONVERSATION termina o lado do iniciador da conversa e envia uma mensagem EndDialog ao serviço de destino. A última instrução SELECT exibe o texto da mensagem de resposta, de modo que você poderá confirmar se ela é a mesma enviada na etapa anterior.
DECLARE @RecvReplyMsg NVARCHAR(100); DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER; BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReplyDlgHandle = conversation_handle, @RecvReplyMsg = message_body FROM InitiatorQueueIntAct ), TIMEOUT 5000; END CONVERSATION @RecvReplyDlgHandle; -- Display recieved request. SELECT @RecvReplyMsg AS ReceivedReplyMsg; COMMIT TRANSACTION; GO
Termine o lado de destino da conversa.
- Quando você executa a instrução END CONVERSATION para o iniciador, o Service Broker envia uma mensagem EndDialog à fila TargetQueueIntAct. O procedimento TargetActiveProc recebe a mensagem EndDialog e emite uma END CONVERSATION que termina o lado de destino da conversa.
Próximas etapas
Você concluiu com êxito um ciclo de mensagem de solicitação-resposta entre o //AWDB/InternalAct/InitiatorService e o //AWDB/InternalAct/TargetService. Essa lição poderá ser repetida o quanto for necessário para transmitir um par de mensagens de solicitação-resposta. Quando você terminar de investigar as instruções SEND e REPLY, descarte todos os objetos que foram usados pela conversa. Para obter mais informações, consulte Lição 4: Descartando os objetos de conversa.
Consulte também