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.MessagingDeclare as seguintes variáveis no formulário:
Dim mQ As MessageQueueAgora 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
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)
|
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
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
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 mNode As New TreeNode() mNode.Tag = "Msg" mNode.Text = m.Label TreeView1.Nodes(Array.IndexOf(filasParticulares, queue)).Nodes.Add(mNode) Next Next
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