Utilizando o Msmq (Microsoft Message Queuing)

 

Neste artigo veremos como utilizar o recurso de enfileiramento de mensagens do Windows (Msmq – Microsoft Message Queuing). Esse recurso é muito utilizado por exemplo quando queremos evitar que o Servidor seja sobrecarregado por um número excessivo de requisições feitas ao mesmo tempo. Com o Msmq, as requisição entrarão na fila de mensagens, e o Servidor irá processá-las na medida do possível.

 

Mais delalhes sobre Msmq e seus beneficios podem ser vistos em:

http://msdn2.microsoft.com/en-us/library/ms711472.aspx


Habilitando o Msmq

O Msmq não vem habilitado no Windows, para instalá-lo é muito simples e não requer nem o cd do Windows.

 

Para isso vá em Control Panel -> Add or Remove Programs. Selecione a aba Add or Remove Windows Componentes. Marque a opção Message Queuing e vá dando Next até finalizar a instalação.

 

gbmsmqfig01.jpg 

 

Criando a nossa fila

Vamos criar a nossa própria fila, a qual armazenará nossas mensagens enviadas.

 

Para isto no Visual Studio abra o Server Explorer (Ctrl+Alt+S), e dê um right-click em Private Queues (dentro de Message Queues) e escolha Create Queue... ( confira a imagem abaixo).

gbmsmqfig02.jpg 

 

OBS: Public Queues são para os casos de utilizar o Msmq com o ActiveDirectory

 

Escreva então “myfirstqueue” e clique em “OK”.

 

Criando o nosso projeto 

Crie um projeto WindowsForms chamado MsmqProject. No Form criado automaticamente ( Form1.cs ), adicione dois textbox para que possamos escrever um mensagem para a fila ( txt_labelEnviarMensagem e txt_bodyEnviarMensagem ), um botão para enviar a mensagem ( bt_Enviar ), dois textbox que irão receber uma mensagem que esteja na fila ( txt_labelReceberMensagem, txt_bodyReceberMensagem ), e um botão para que possamos buscar uma mensagem na fila ( bt_Receber ). Adicione também alguns labels explicativos. O Form deve ficar parecido com a figura abaixo:

gbmsmqfig03.jpg 

 

Adicione também o componente MessageQueue no Form. Para isso, na view Server Explorer, arraste a fila que criamos (myfirstqueue) para o Form. Selecione o controle e altere o seu nome para apenas messageQueue.


gbmsmqfig04.jpg                                             =>
gbmsmqfig05.jpg

  


Escrevendo o código de envio Mensagens

Dê um duplo clique no botão enviar e escreva o código abaixo

 

string label = txt_labelEnviarMensagem.Text;

string body = txt_bodyEnviarMensagem.Text;

 

messageQueue.Send( body, label);

 

txt_labelEnviarMensagem.Text = string.Empty;

txt_bodyEnviarMensagem.Text = string.Empty;

 

Como podemos ver, é muito simples enviar uma mensagem para nossa fila. Apenas recuperamos os valores nos textbox e passamos como parâmetro para o método Send. Em seguida limpamos os textbox.

 

Escrevendo o código de recebimento de Mensagens

Dê um duplo clique no botão Receber e escreva o código abaixo

 

int timeout = 1000; //tempo de espera por uma nova mensagem, caso não exista nenhuma na fila

System.Messaging.Message message = messageQueue.Receive(new TimeSpan(timeout));

 

message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] {typeof(String)});

 

txt_labelReceberMensagem.Text = message.Label;

txt_bodyReceberMensagem.Text = (string)message.Body;

 

Podemos ver também que é muito simples receber uma mensagem de nossa fila. Primeiro chamamos o método Receive, passando como parâmetro um timeout para o caso de não existir nenhuma mensagem na fila.

 

É importante salientar que caso nenhuma mensagem chegue a fila durante o tempo que estipulamos no timeout, um exceção será lançada. Logo é necessário adicionar um tratamento de exceção, o qual foi omitido neste artigo por questões de simplicidade..

 

Em seguida passamos para o objeto Message qual o formato da mensagem. Neste artigo utilizamos uma string para tornar tudo mais simples, mais é possível passar para a fila qualquer objeto serializável, por exemplo um Xml.

 

E finalmente passamos para os textbox o conteúdo da mensagem recebida.

 

Conclusão

Neste artigo vimos como utilizar o Msmq da maneira mais básica possível. Num próximo artigo veremos como utilizar recursos mais avançados, como objetos serializáveis e transação.

 

Até a próxima.

 

Gustavo Barros