Trabalhando com o Service Broker no Microsoft SQL Server 2008, 2008 R2 e 2012 – Final.

Boa tarde, Comunidade!

Antes de começar a destacar esta última parte da nossa série sobre Service Broker, vou compartilhar outro assunto com vocês. Como de costume todo dia 1º de Abril é considerado o dia da mentira, mas desde 2007 este dia se tornou algo de muita importância e ansiedade, foi justamente no dia 01/04/2007 que me tornei pela primeira vez MVP de SQL Server, desde então, já se passaram sete anos e hoje dia 03/04/2014 estou mais uma vez comemorando mais uma MVP Award, sendo a minha oitava renovação, completando mais um ciclo.

Agradeço a todos que fazem parte desta caminhada, que sempre me ajudaram a conseguir atingir esta marca.

Outro assunto que eu gostaria de compartilhar com vocês é o lançamento do Microsoft SQL Server 2014, que oficialmente foi disponibilizado no dia 01/04/2014 para comercialização e uso oficial.

Se você quiser saber mais sobre algumas novidades sobre esta nova versão, acesse: http://www.youtube.com/embed/ZlKnwbpkgvk   

Como você deve esta acompanhando, estamos chegando ao final desta série sobre o Service Broker dedicado as versões 2008, 2008 R2 e 2012. Nesta reta final, vamos trabalhar com o processo de recebimento das mensagens que nosso aplicativo de Service Broker enviado anteriormente, fazendo uso das mensagens, contratos, filas e serviços.

Para que você possa acompanhar e entender o funcionamento do Service Broker em relação ao nosso cenário, recomendo que acesse e leia as Partes I, II e III publicadas anteriormente nos seguintes links:

https://pedrogalvaojunior.wordpress.com/2013/10/22/trabalhando-com-o-service-broker-no-microsoft-sql-server-2008-2008-r2-e-2012-parte-i/

https://pedrogalvaojunior.wordpress.com/2013/11/21/trabalhando-com-o-service-broker-no-microsoft-sql-server-2008-2008-r2-e-2012-parte-ii/

https://pedrogalvaojunior.wordpress.com/2014/02/07/trabalhando-com-o-service-broker-no-microsoft-sql-server-2008-2008-r2-e-2012-parte-iii/

Vou começar esta parte destacando o processo de Recebimento de Mensagens, que consiste basicamente no uso dos comandos Receive Top e conhecido e super utilizado comando Select.

Desejo uma boa leitura e espero que goste deste final.

Processando o Recebimento de Mensagens

O processo para recebimento de mensagens tratadas por aplicações que fazem uso do Service Broker, ou diretamente no Management Studio, é realizado basicamente através do uso do comando Receive, em conjunto com a cláusula Top.

A principal função do comando Receive é recuperar uma ou mais mensagens que possam existir na fila que o Serviço invocado pelo Service Broker esta utilizando no momento. Normalmente este comando deverá remover a mensagem da sua fila ou atualizar o seu Status, dependendo da forma de configuração que esta definição para a fila em uso.

Comando Receive

O comando Receive possui uma simples função realizar uma leitura na fila que esta sendo processada a fim de identificar o conjunto de mensagens que estão dentro deste repositório, passando uma ordem de atualização de status ou remoção da mensagem da fila. Para que este simples procedimento possa ser realizado, existe um conjunto de argumentos que podem ser utilizados em conjunto com o comando, os quais serão reconhecidos pelo SQL Server como orientadores da ação e tratamento que deve ser feito com a mensagem ou conjunto de mensagens capturada. A seguir apresento a relação de argumentos:

    • Waitfor: Orienta a instrução RECEIVE para aguardar a chegada de uma mensagem na fila, se não houver nenhuma mensagem no momento.

 

    • Top (n): Indica o número máximo de mensagens a serem obtidas e posteriormente retornadas. Se essa cláusula não estiver especificada, todas as mensagens que atenderem aos critérios da instrução serão retornadas. Para este argumento é permitido utilizar algumas opções: Column_Name, Expression ou Column_Alias, como possíveis filtros de dados.

 

    • From: Informa à fila que deverá ser utilizada e conter o conjunto de mensagens capturadas. Em conjunto com este argumento, podemos utilizar as opções: Database_Name, Schema_Name e Queue_Name, como possíveis owners(responsáveis ou donos) da fila.

 

    • Into table_variable: Indica para o SQL Server que o retorno das mensagens deverá ser armazenado possivelmente em uma variável do tipo tabela, onde a tabela deve ter o mesmo número de colunas que as mensagens. O tipo de dados de cada coluna na variável de tabela deve poder ser convertido implicitamente no tipo de dados da coluna correspondente nas mensagens. Caso esta opção venha a ser omitida, o SQL Server retornará as mensagens no formato padrão, identificado cada valor como um possível resultado.

 

    • Where: Apresenta a conversa ou grupo de conversa das mensagens recebidas. Se omitido, as mensagens serão retornadas do próximo grupo de conversa disponível. Para este argumento, podemos utilizar as opções: Conversation_Handle e Conversation_Group_Id, para ajudar o Service Broker a identificar manipulador da mensagem ou grupo de conversa que estamos capturando dentro da fila. Vale destacar, que os valores passados para estas duas opções são tratados como Identificadores Únicos ou UniqueIdentifier.

 

    • TimeOut: Determina o período de tempo, em milissegundos, durante o qual a instrução aguarda uma mensagem. Por padrão, esta cláusula pode ser usada apenas com a cláusula WAITFOR. Se essa cláusula não estiver especificada ou se o tempo limite for -1, o tempo de espera será ilimitado. Ao termino do tempo limite o RECEIVE retornará um conjunto de resultados vazio.

 

Importante: A instrução RECEIVE lê mensagens de uma fila e retorna um conjunto de resultados. Este conjunto consiste em zero ou mais linhas, cada uma das quais contêm uma mensagem. Se a instrução INTO não for usada e column_specifier não atribuir os valores a variáveis locais, a instrução retornará um conjunto de resultados ao programa de chamada.

A instrução RECEIVE remove mensagens recebidas da fila a menos que a fila especifique retenção de mensagem. Quando a configuração de RETENTION da fila estiver ON, a instrução RECEIVE atualizará a coluna status para 0,  e deixará as mensagens na fila. Quando uma transação que contém uma instrução RECEIVE é revertida, todas as alterações feitas na fila na transação também são revertidas, retornando mensagens para a fila.

Muito legal, já conhecemos um pouco do comando Receive, seus argumentos, opções e principalmente a maneira que este comando trabalho, podemos evoluir um pouco mais e começar a fazer o processo de recebimento das mensagens, iniciando pela identificação de quais mensagens estão em nossa Fila.

Mas como estamos no final desta caminhada, muito coisa já foi apresentada anteriormente e que como atualmente memória é algo que normalmente falta em nossas cabeças, vou refrescar nossas lembranças apresentando novamente o nosso cenário, com toda estrutura de recurso, através da Tabela 1 abaixo:

Nome do Recurso

Funcionalidade

MyDatabaseServiceBroker

Database – Banco de Dados

mtEnvioMensagem

Message Type – Tipo de Mensagem

mtRecebimentoMensagem

Message Type – Tipo de Mensagem

cProcessaMensagens

Contract – Contrato

qDestino

Queue – Fila

qOrigem

Queue – Fila

sDestino

Service – Serviço

sOrigem

Service – Serviço

AutoCreatedLocal

Route – Rota

Tabela 1 – Estrutura e Recursos – Service Broker.

Agora você não pode reclamar, acredito que já conseguiu se lembrar no nosso cenário, estrutura e principalmente dos recursos que estamos utilizando.

Um detalhe importante, você pode observar que a Tabela 1, apresenta um recurso do tipo Route (Rota), em nenhum momento este recurso foi abordado neste cenário, mas ele esta presente é possível uma grande importância.

Quando uma aplicação Service Broker é criada por padrão o Microsoft SQL Server, cria uma rota denominada AutoCreatedLocal, sendo esta, endereça como uma Rota Local e responsável por permitir o tráfego dos dados que o Service Broker esta processando. Caso você queria saber e conhecer mais sobre este elemento e sua funcionalidade, consulte os Manuais do Microsoft SQL Server (Books Online), procurando sobre Create Route.

Vamos então trabalhar com o nosso primeiro bloco de código, denonimado Código 1, procurando a relação de mensagens que possam existir em nossa fila, denominada qDestino, conforme apresentado abaixo:

— Código 1 – Procurando a relação de Mensagens na Fila – qDestino –

USE MyDatabaseServiceBroker

GO

SelectCast(Message_Body asXml)from qDestino

Go

Note que após o Codigo 1 ser executado o Management Studio deverá apresentar a nossa relação de mensagens armazenadas na Fila qDestino, onde o resultado deverá ser no formato de XML, pois nossas mensagens foram criadas e enviadas neste formato. A Figura 1 apresentada abaixo ilustra este resultado:

ServiceBroker-P4-1

Figura 1 – Relação de Mensagens armazenadas na Fila qDestino.

Já sabemos quais mensagens estão presentes neste fila, e agora o próximo passo é realizar a leitura e recebimento dos dados que estão contidos em nossa mensagem. Para isso, vamos utilizar o bloco de código 2, apresentado na seqüência:

— Código 2 – Realizando a Leitura e Recebimento de Dados –

USE MyDatabaseServiceBroker

GO

Declare @MyConversationHandle UniqueIdentifier,

@MyMessage_Body XML,

@MyMessage_Type_Name sysname;

— Iniciando o Bloco de Transação —

BeginTransaction;

— Realizando o Recebimento da Mensagem —

RECEIVETOP(1)

@MyMessage_Type_Name=message_type_name, @MyConversationHandle=conversation_handle,

@MyMessage_Body=message_body

FROM [qDestino]

— Apresentando o Retorno da Mensagem —

SELECT @MyMessage_Body As MyMessage

— Confirmando o Bloco de Transação —

Commit

Pois bem, você viu como foi simples e fácil obter os dados na nossa Mensagem que estava armazenada na Fila qDestino, em nenhum momento precisamos realizar qualquer tipo de configuração complexa ou necessitar de recursos externos.

O Service Broker é totalmente capaz de retornar os dados, o segredo esta no uso do comando Receive em conjunto com a cláusula Top, onde informamos a quantidade de mensagens que deveriam ser retornadas, em seguida através do comando Select apresentamos o conteúdo da variável @MyMessage_Body. Para ilustrar ainda mais, a Figura 2 apresenta o conteúdo da mensagem que acabamos de recuperar:

ServiceBroker-P4-2

Figura 2 – Conteúdo da mensagem recuperado através do comando Receive.

Neste momento, se você quiser consultar o conteúdo existente na fila qDestino, poderá observar que esta mensagem já não esta mais presente.

Após tudo ter corrido normalmente e dentro do espero, o último passo que iremos realizar, consiste basicamente em analisar uma mensagem que iremos consultar dentro da nossa fila qDestino, com base, no seu retorno interagir com nosso diálogo e devolver uma mensagem para fila qOrigem, finalizando o processo de envio e recebimento de mensagens. Para tal finalidade vamos utilizar os Blocos de Código 3 e 4, apresentados a seguir:

— Código 3 – Enviando Mensagem —

USE MyDatabaseServiceBroker

GO

Declare @MyConversationHandle Uniqueidentifier

BeginTransaction

— Inicia um diálogo entre os serviços da origem e destino

BEGIN DIALOG @MyConversationHandle

FROMSERVICE [sOrigem]

TOSERVICE‘sDestino’

ONCONTRACT [cProcessaMensagens]

WITHENCRYPTION=OFF,

LIFETIME= 600;

— Declarando a Estrutura e Conteúdo da Mensagem —

Declare @MyMensagemServiceBroker XML

SET @MyMensagemServiceBroker =N'<?xml version=”1.0″?>

<MSN Num=”2″>

<Titulo>Minha segunda mensagem</Titulo>

<Texto>Olá esta é a segunda mensagem de teste no Service Broker</Texto>

</MSN>’;

— Enviando uma mensagem no Diálogo —

SENDONCONVERSATION @MyConversationHandle

MESSAGETYPE [mtEnvioMensagem](@MyMensagemServiceBroker)

Commit Transaction

— Código 4 – Respondendo a Mensagem – Interagindo com o Diálogo —

USE MyDatabaseServiceBroker

GO

Declare @MyConversationHandle UniqueIdentifier,

@MyMessage_Body XML,

@MyMessage_Type_Name sysname;

— Iniciando o Bloco de Transação —

BeginTransaction;

— Realizando o Recebimento da Mensagem —

RECEIVETOP(1)

@MyMessage_Type_Name=message_type_name,

@MyConversationHandle=conversation_handle,

@MyMessage_Body=message_body

FROM [qDestino]

— Verifica se a mensagem foi enviada através da Message Type – mtEnviomensagem —

if @MyMessage_Type_Name =N’mtEnvioMensagem’

Begin

DECLARE @MySourceMessage XML

SET @MySourceMessage =‘<Origem>Retorno da Mensagem de Destino foi respondida para Origem.</Origem>’;

SENDONCONVERSATION @MyConversationHandle — Interage no mesmo diálogo

MESSAGETYPE [mtEnvioMensagem]

(@MySourceMessage)

— Finaliza o diálogo encerrando a conversação —

ENDCONVERSATION @MyConversationHandle

End

— Finaliza o Bloco de Transação —

COMMITTransaction

Ao executarmos estes dois blocos de códigos realizamos o processo completo de envio e recebimento de mensagens através dos recursos que configuramos para o Service Broker, nosso último passo é verificar as mensagem na Fila qOrigem, como forma, de garantir e ter certeza que a mensagem de retorno foi recebida, vamos então fazer uso do Bloco de Código 5, apresentado na seqüência.

— Código 5 – Consultando as Mensagens de Retorno na Fila qOrigem —

USE MyDatabaseServiceBroker

GO

SELECTcast(message_body asXML)FROM [qOrigem];

Go

RECEIVECast(message_body asxml)FROM [qOrigem];

Go

Ao executar este bloco de código, você vai poder observar que não estamos fazendo nada de diferente, simplesmente utilizando o comando Select para consultar as informações na Fila qOrigem, em seguida recebendo os dados utilizando o comando Receive.

Com isso, chegamos ao fim desta longa caminhada, iniciado no mês de Novembro de 2013, passando por um conjunto de quatro artigos que foram esta série, dedicada ao Service Broker.

Mais uma vez obrigado, espero que esta tenha entendido como este recurso que foi introduzido na versão 2005 e ainda presente nas atuais versões pode ser aplicado, procurei de forma simples e prática, demonstrar e elucidar os conceitos e funcionamentos sobre: Filas, Mensagens, Contratos, Serviços e Diálogos.

Como eu sempre costumo dizer, a cada dia conhecemos e aprendemos um pouco mais sobre este fascinante e misterioso SQL Server, mesmo em recursos que já estão presentes em versões e edições mais antigas. O importante é saber que ele existe e pensar que em algum momento você poderá ter a necessidade de utilizar.

Agradeço a sua visita e atenção, mais um mês começando, e muita coisa estar por vir, ainda mais com o lançamento oficial do Microsoft SQL Server 2014, que com certeza será uma versão que vai revolucionar a forma como os dados são tratados e armazenados em cloud.

Um grande abraço, tudo de bom, saúde, vamos em frente.

Até mais.

Autor: Junior Galvão - MVP

Profissional com vasta experiência na área de Tecnologia da Informação e soluções Microsoft. Graduado no Curso Superior em Gestão da Tecnologia de Sistemas de Informação pela Uninove - Campus São Roque. Pós-Graduado no Curso de Gestão e Engenharia de Processos para Desenvolvimento de Software com RUP na Faculdade FIAP - Faculdade de Informática e Administração Paulista de São Paulo. Pós-Graduado em Gestão da Tecnologia da Informação Faculdade - ESAMC Sorocaba. Cursando Mestrado em Ciências da Computação - UFSCar - Campus - Sorocaba. Formação MCDBA Microsoft, autor de artigos acadêmicos e profissionais postados em Revistas, Instituições de Ensino e WebSistes. Meu primeiro contato com tecnologia ocorreu em 1995 após meus pais comprarem nosso primeiro computador, ano em que as portas para este fantástico mundo se abriram. Neste mesmo ano, comecei o de Processamento de Dados, naquele momento a palavra TI não existia, na verdade a Tecnologia da Informação era conhecida como Computação ou Informática, foi assim que tudo começou e desde então não parei mais, continuando nesta longa estrada até hoje. Desde 2001 tenho atuado como Database Administrator - Administrador de Banco de Dados - SQL Server em tarefas de Administração, Gerenciamento, Migração de Servidores e Bancos de Dados, Estratégias de Backup/Restauração, Replicação, LogShipping, Implantação de ERPs que utilizam bancos SQL Server, Desenvolvimento de Funções, Stored Procedure, Triggers. Experiência na Coordenação de Projetos de Alta Disponibilidade de Dados, utilizando Database Mirroring, Replicação Transacional e Merge, Log Shipping, para versões: 2000, 2005, 2008, 2008 R2, 2012 e 2014. Atualmente trabalho como Administrador de Banco de Dados no FIT - Instituto de Tecnologia da Flextronics, como também, Consultor em Projetos de Tunnig e Performance para clientes. Desde 2008 exerço a função de Professor Universitário, para as disciplinas de Banco de Dados, Administração, Modelagem de Banco de Dados, Programação em Banco de Dados, Sistemas Operacionais, Análise e Projetos de Sistemas, entre outras. Possuo titulação Oficial Microsoft MVP - SQL Server renovada desde 2007.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s