VB 2005 - Trabalhando com o serviço de mensageira MSMQ


Este artigo eu pretendo ajudá-lo a usar o MS Message Queueing - MSMQ para enviar e receber mensagens; mas afinal o que vem a ser esse tal de MSMQ ???

A figura acima , retirada do site : http://msdn2.microsoft.com/en-us/library/ms711472.aspx mostra a utilização de uma fila de mensagens.

MSMQ - MS Message Queueing - é a tecnologia da Microsoft para enfileirar mensagens permitindo que aplicações distintas enviem mensagens entre si. Portanto o MSMQ trata com filas de mensagens. A tecnologia MSMQ permite que aplicações rodando de forma assíncrona se comuniquem através de sistemas e redes distintas que podem estar fora do ar temporariamente. A MSMQ garante ou pelo menos tenta garantir os seguintes itens: entrega da mensagem, roteamento eficiente, segurança, prioridade.

Se você pensa que esse tipo de tecnologia não é muito usada , engana-se, ela muito usada em aplicações transacionais e em soluções corporativas que necessitam de um alto desempenho. Creio que o SBP , Sistema Brasileiro de Pagamentos, use o serviço de mensageria de filas; citando um exemplo mais do nosso dia a dia, a entrega da declaração de imposto de renda pode ser visto como um exemplo de aplicação de fila , pois as declarações são entregues e a medida que vão chegando ficam em uma fila para processamento.

Geralmente quando se o MSMQ pela primeira vez têm-se as seguintes dúvidas:

Vamos com calma...

Para poder usar o MSMQ a primeira coisa a fazer é instalar o MSMQ na sua máquina e para sua sorte geralmente ele é instalado com o Windows e precisa somente ser habilitado.

Se você não localizou o item Message Queuing ou Serviço de enfileiramento de mensagens, em português,  então ele não esta instalado na sua máquina local.

Para instalar o MSMQ siga o roteiro a seguir:

1- Clique no Painel de controle -> Adicionar ou Remover Programas;
2- Selecione a aba Adicionar/Remover componentes do Windows;
3- Marque a opção Serviço de enfileiramento de mensagens e clique em Avançar até finalizar a instalação.

 

Criando um fila no MSMQ

 

Agora que você já instalou o MSMQ vamos criar um fila, ou seja, um armazenamento temporário de mensagem; acione o painel de controle -> Desempenho e Manutenção -> Ferramentas Administrativas e clique em Gerenciamento do Computador.

 

A seguir expanda o item Enfileiramento de mensagens conforme figura abaixo;

 

 

Clique com o botão direito sobre o item Filas particulares e selecione Novo->Fila Particular. Na janela Nova fila particular informe o nome da fila

 

 

Em seguida você verá a fila criada , e , selecionando-a poderá notar que ela esta preparada para receber mensagens na fila:

 

 

Vejamos agora como usar o tal de MSMQ.  Para usar os recursos do MSMQ utilizamos o namespace System.Messaging

 

Vamos criar duas funcionalidades básicas para usar a fila :  enviar uma mensagem para a fila e ler uma mensagem da fila.

 

1- Criando uma Fila

 

Para criar uma fila via código usamos o código Create da classe MessageQueue. Desta forma, para criar a fila Mac nas filas Particulares via código fazemos:

 

Try
    Dim fila As MessageQueue
    fila = MessageQueue.Create(".\Private$\Mac")
    'Se ocorrer um erro obtêm uma exceção do tipo MessageQueueException
Catch ex As MessageQueueException
     MsgBox(ex.Message)
End Try

 

2- Enviando uma mensagem para a fila

 

Para enviar uma mensagem para a fila usamos o método Send da classe MessageQueue. Assim para enviar uma mensagem para fila Mac;

 

 Mac.Send("<<Message>>", "<<Message Label>>")

O método Send toma um objeto como primeiro parâmetro para denotar o corpo da mensagem , isto pode ser um um objeto Message ou qualquer outro objeto. Se o objeto não for do tipo Message então ele é serializado e armazenado no corpo da mensagem.

3- Lendo uma mensagem da fila

 

Há dois tipos de operações que podem ocorrer na leitura de mensagens da fila: a mensagem é removida após a leitura ou a mensagem permanece na fila após a leitura (peeking). Para ler mensagens da fila Mac usamos o seguinte código

 

Dim  msg  As  Message
msg = Mac.Receive()
MessageBox.Show(msg.Body)

 

Existem muitos métodos Receive sobrecarregados o que foi utilizado acima bloqueia o chamador indefinidamente até que a mensagem estar disponível na fila. Se você não quiser ficar bloqueado pode usar o método Receive que usa o argumento TimeSpan e que lança uma exceção se a mensagem não for recebida no tempo. No exemplo abaixo o método aguarda por 1000 ticks (1 segundo) até abortar:

 

Dim  msg  As  Message
msg = Mac.Receive(New TimeSpan(1000)
MessageBox.Show(msg.Body)

O método Receive opera de forma síncrona para trabalhar de forma assíncrona você pode usar os métodos BeginPeek e EndPeek ou BeginReceive e EndReceive respectivamente.

4- Excluir uma Fila

Para excluir uma fila você pode usar o método Delete do objeto MessageQueue. Para deletar a fila Mac criada anteriormente fazemos:

Mac.Delete(".\Private$\MinhaFila")

Temos também os seguintes métodos na classe MessageQueue:
 

Purge Deleta todas as mensagens contidas na fila.
GetAllMessages Retorna todas as mensagens que estão na fila.
GetPrivateQueuesByMachine Retorna todas as filas particulares no computador especificado.
Exists Determina se uma fila definida no caminho existe.
GetMessageEnumerator Cria um objeto enumerator para todas as mensagens na fila.
Formatter Obtêm ou define a formatação usada para serializar um objeto ou deserializar um objeto do corpo da mensagem lida de ou escrita para uma fila.

 

Abra então o Visual Basic 2005 Express e crie um novo projeto do tipo WIndows Application com o nome usando_MSMQ;

 

No formulário padrão inclua um ListBox , uma controle TextBox e dois controles Button conforme o leiaute abaixo. A seguir, a partir da toolbox, inclua um componente MessageQueue no formulário;

 

 

Defina os seguintes imports no formulário do projeto:

Imports System.Messaging
Imports
System.IO

Declare as seguintes variáveis no formulário:

Dim mQ As MessageQueue
Dim mes As Message
Dim br As BinaryReader

Agora no evento Click do botão Enviar Mensagem inclua o seguinte código:

 

Private Sub btnEnviaMensagem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnviaMensagem.Click


Dim
mensagem As String = Now.TimeOfDay.ToString & ":" & txtMsg.Text


If
MessageQueue.Exists(".\Private$\Mac")
Then

    mQ = New MessageQueue(".\Private$\Mac")

Else

    mQ = MessageQueue.Create(".\Private$\Mac")

End If
 

mQ.Send(mensagem, "Mac")

lstMSMQ.Items.Add("Msg::> Mensagem enviada para a fila. " & Now.TimeOfDay.ToString)


End
Sub


Estou enviando mensagens para a fila Mac que foi criada no Gerenciador do Computador no início do artigo.

 

No evento Click do botão Ler Mensagem inclua o seguinte código:

 

Private Sub btnLeMensagem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLeMensagem.Click


Dim
texto As
String


Try

   mes = mQ.Receive(New TimeSpan(0, 0, 3))

    br = New BinaryReader(mes.BodyStream)

    texto = New String(br.ReadChars(CType(mes.BodyStream.Length, Integer)))

    lstMSMQ.Items.Add("RE::> " & texto)

Catch

   lstMSMQ.Items.Add("Não há mensagens recebidas.")

End Try

End Sub

 

Executando o projeto e fazendo alguns testes iremos obter:

 

 

Se você quiser pode exibir todas as filas particulares definidas no seu computador local. Vamos exibir as filas particulares !!!!

 

Inclua um controle TreeView no formulário e um botão de comando como texto: Exibir Filas Particulares


A seguir no evento Click deste botão inclua o seguinte código:

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


Try

    Dim queue As MessageQueue
 

  TreeView1.Nodes.Clear()

  TreeView1.BeginUpdate()
 

   Dim filasParticulares() As MessageQueue = MessageQueue.GetPrivateQueuesByMachine("localhost")
 

  For Each queue In filasParticulares

      Dim qNode As New TreeNode()

      qNode.Text = queue.QueueName

      qNode.Tag = "Fila"
 

      TreeView1.Nodes.Add(qNode)


      Dim
m As Message


      For
Each m In queue

         Dim mNode As New TreeNode()

         mNode.Tag = "Msg"

         mNode.Text = m.Label

         TreeView1.Nodes(Array.IndexOf(filasParticulares, queue)).Nodes.Add(mNode)

      Next

Next


TreeView1.EndUpdate()

Catch ex As Exception

    MessageBox.Show(ex.Message, "Erro")

End Try

End Sub

 

Executando o projeto e enviando 3 mensagens para a fila Mac ao clicar no botão para exibir as filas particulares iremos obter:

 

 

Eu poderia continuar a mostrar os demais métodos mas a sua utilização é muito simples e seguem o mesmo padrão aqui mostrado. Então fica por sua conta.

 

Para uma aplicação mais robusta seria melhor definir uma classe para enviar e ler mensagens e efetuar um tratamento de erros.

 

Pegue o projeto completo aqui: usando_MSMQ.zip

Até o próximo artigo VB.NET 


José Carlos Macoratti