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.
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).
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:
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.
=>
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