Sistemas Empresariais Integrados
Tecnologias de messaging
(MSMQ)
Tecnologias de messaging
• Microsoft Message Queuing (MSMQ)
– faz parte do sistema operativo
– infra-estrutura de mensagens e plataforma de
desenvolvimento
– aplicações distribuídas e assíncronas baseadas em
Windows
– oferece garantia de entrega, roteamento eficiente,
segurança, transacções, prioridades, etc.
• Versão 1.0
– Windows 95/98/Me e Windows NT 4.0
• Versão 2.0
– Windows 2000
• Versão 3.0
– Windows XP e 2003
• Versão 4.0
– Windows Vista e Windows Server 2008
• Versão 5.0
– Windows 7 e Windows Server 2008 R2
Tecnologias de messaging (MSMQ)
• Visão geral
Emissor (sender) Emissor (sender) Emissor (sender) Receptor (receiver) Receptor (receiver) Receptor (receiver) Directory Service (opcional) filas (queues)– filas transaccionais vs. não-transaccionais
– entrega rápida vs. recuperável
– roteamento directo vs. store-and-forward
– destino único vs. múltiplos destinos
• queue vs. distribution list
– possibilidade de encriptação e autenticação
Emissor
(sender) destination queue msg
Tecnologias de messaging (MSMQ)
• Receptor (receiver)
– leitura local vs. remota
• preferencialmente local
– filas transaccionais vs. não-transaccionais
– leitura síncrona vs. assíncrona
– peek vs. retrieve
• peek lê mas deixa mensagem na fila
destination queue msg
• Tipos de filas
– filas criadas pelas aplicações
• fila de destino
• fila de administração (acknowledgments) • fila de resposta (a usar pelo receptor)
• report queues (para tracking de mensagens)
Emissor (sender) Receptor (receiver) destination queue response queue msg1 msg2
Tecnologias de messaging (MSMQ)
• Tipos de filas
– filas usadas pelo sistema MSMQ
• queue journal / computer journal (guardam cópias) • dead-letter queue (mensagens não entregues) • outgoing queues (ligação a filas remotas)
– filas públicas
• ComputerName\QueueName
– filas privadas
• ComputerName\PRIVATE$\QueueName
– fila na máquina local
• .\QueueName • .\PRIVATE$\QueueName
– sub-filas
• ComputerName\QueueName;Subqueue • ComputerName\PRIVATE$\QueueName;SubqueueTecnologias de messaging (MSMQ)
• Serviço de directório
– usado para filas públicas
– implementado por Active Directory (LDAP)
Serviço de directório
Aplicação
filas
• MSMQ é um sistema de mensagens
– não é só uma interface como o JMS
• os principais objectivos são:
– comunicação assíncrona de mensagens – persistência de mensagens entre aplicações
filas (queues) Message Queuing
Aplicação 1 Aplicação 2
Tecnologias de messaging (MSMQ)
• Interacções suportadas por MSMQ
– mensagens unidireccionais
• 1 fila
– interacções pedido-resposta
• 2 filas: uma para o pedido, outra para a resposta • a fila de resposta é especificada no pedido
• exige o uso de correlação entre pedido e resposta
– mensagens em modo broadcast
– as filas são mantidas por um Queue Manager
• corre como um serviço separado das aplicações • existe um protocolo de comunicação entre as
aplicações e o queue manager
Emissor (sender) Receptor (receiver) fila (queue) Queue Manager
Tecnologias de messaging (MSMQ)
• Componentes de MSMQ
– MSMQ também suporta a interacção entre queue
managers distintos
– transferência assíncrona de mensagens pela rede
Emissor (sender) Receptor (receiver) fila (queue) Queue Manager fila (queue) Queue Manager
• Componentes de MSMQ
– quando a fila de destino é remota
• aplicação entrega a mensagem ao queue manager local • queue manager local coloca a mensagem numa fila
(outgoing queue) criada especialmente para o efeito • queue manager local envia a mensagem para queue
manager remoto
• o queue manager remoto entrega a mensagem à aplicação de destino
– pode haver vários queue managers intermédios
Tecnologias de messaging (MSMQ)
• Componentes de MSMQ – queue managers
Emissor (sender) Receptor (receiver) local queue Queue Manager destination queue Queue Manager outgoing queue Optional Interim Queue managers Optional Interim Queue managers Outros queue managers intermédios
– MSMQ pode usar um Serviço de Directório
Emissor (sender) Receptor (receiver) (opcional) fila (queue) Queue Manager Directory ServiceTecnologias de messaging (MSMQ)
• Componentes de MSMQ
– o serviço de directório permite:
• guardar metadados sobre as filas e sobre o sistema • descobrir as filas (públicas) existentes
• guardar a topologia da rede para roteamento de mensagens
• Componentes de MSMQ
– também pode haver Coordenador de Transacções
Aplicação (opcional) fila (queue) Queue Manager Transaction Coordinator
Tecnologias de messaging (MSMQ)
• Componentes de MSMQ
– o coordenador de transacções permite:
• estabelecer transacções entre uma aplicação e um queue manager
• gerir o estado da transacção
• aceitar ou recusar mensagens conforme o estado da transacção
Microsoft, “MS-MQSO: Message Queuing System Overview”, February 2011
Tecnologias de messaging (MSMQ)
• Diagrama de
• Garantias de entrega
– Best-effort Express Delivery
• at-most-once, com mensagens armazenadas em memória
• sujeito a perda de mensagens por falhas do sistema ou da rede
– Best-effort Delivery
• at-most-once, com mensagens armazenadas de forma persistente pelo queue manager
• sujeito a perda de mensagens por falha da rede
Tecnologias de messaging (MSMQ)
• Garantias de entrega (cont.)
– Exactly-once Delivery
• exactly-once, só com filas transaccionais
• aplicação envia mensagens para a fila no contexto de uma transacção
• dependendo do resultado da transacção, o queue manager aceita e armazena as mensagens
• as mensagens são transferidas entre queue managers até chegarem à fila de destino
Emissor (sender)
Receptor (receiver)
Source Queue Manager outgoing queue
transactional dead-letter queue
Destination Queue Manager destination queue
Processo de confirmação da transacção
MSMQ
• Transacções
• Acknowledgments
Emissor (sender) destination queue Queue Manager administration queue Receptor (receiver) msg ackTecnologias de messaging (MSMQ)
• Acknowledgments
– com aknowledgments é possível saber
• se a mensagem chegou à fila de destino
– Acknowledgment = ReachQueue
• se a mensagem foi recebida pelo receptor
– Acknowledgment = Receive
– as mensagens de acknowledgment aparecem
numa fila de administração própria
– também existem acknowledgments negativos
• se a mensagem não chegar à fila de destino • se a mensagem não for recebida pelo receptor
– exemplos
• BadDestinationQueue, BadEncryption, BadSignature, HopCountExceeded, NotTransactionalQueue,
QueueDeleted, QueueExceedMaximumSize, ReachQueueTimeout, ReceiveTimeout, etc.
Tecnologias de messaging (MSMQ)
• Acknowledgments
– tem de haver correlação com a mensagem original
– campos importantes na mensagem de ack.
• MessageType – indica que a mensagem é um acknowledgment
• Acknowledgement – diz qual é o tipo de ack. positivo ou negativo (p.ex. ReachQueue)
• CorrelationId – contém o id da mensagem original a que se refere este ack.
• Mensagens
– todo o conteúdo são propriedades (nome-valor)
– uma das propriedades é o body
• vazio
• tipos de dados básicos • texto
• objecto serializável • array de bytes
Tecnologias de messaging (MSMQ)
• Propriedades das mensagens
– AcknowledgeType (tipo de acknowledgment desejado)
– Acknowledgement (se a msg for um ack., aqui vem o tipo)
– AdministrationQueue (fila a usar para o acknowledgment)
– ArrivedTime (chegada à fila de destino)
– Body / BodyStream / BodyType – CorrelationId
– DestinationQueue
– Formatter (formatar em XML ou binário)
– Id (identificador único)
– MessageType (normal, acknowledgement, ou report)
– Priority (determina posição na fila de destino)
– Recoverable (true = persistência)
– ResponseQueue – SenderId
– SentTime – SourceMachine
– TimeToBeReceived (tempo máx. até ser lida no destino)
– TimeToReachQueue (tempo máx. até chegar à fila de destino)
Tecnologias de messaging (MSMQ)
• Propriedades usadas para segurança
– Authenticated (true = mensagem com assinatura)
– DestinationSymmetricKey (chave para [des]encriptar o body) • este campo está encriptado pela chave pública do queue manager
– DigitalSignature (assinatura digital da msg)
– EncryptionAlgorithm
– HashAlgorithm (algoritmo usado para assinar)
• Como usar MSMQ
– em C# e .NET Framework a API está no namespace
System.Messaging
– verificar se uma fila existe:
string queueName = @".\private$\purchaseorders"; if (MessageQueue.Exists(queueName)) { … }
Tecnologias de messaging (MSMQ)
• Como usar MSMQ
– abrir uma fila que já existe
string queueName = @".\private$\purchaseorders"; MessageQueue mq = new MessageQueue(queueName);
– criar e abrir uma fila que ainda não existe
string queueName = @".\private$\purchaseorders"; MessageQueue mq = MessageQueue.Create(queueName);
– criar mensagem
Message msg = new Message(...) Message.Body = …
– enviar mensagem
MessageQueue mq = new MessageQueue(queueName); mq.Send(msg);
Tecnologias de messaging (MSMQ)
• Como usar MSMQ
– receber mensagem
MessageQueue mq = new MessageQueue(queueName); Message msg = mq.Receive();
– receber mensagem, mas sem remover da fila
MessageQueue mq = new MessageQueue(queueName); Message msg = mq.Peek();
• Como usar MSMQ
– receber mensagem assincronamente
1. implementar um método para servir de event handler (callback)
2. adicionar o método como handler para o evento ReceiveCompleted
3. chamar BeginReceive() em vez de Receive()
Tecnologias de messaging (MSMQ)
private static void MyReceive(Object source,
ReceiveCompletedEventArgs asyncResult) {
MessageQueue mq = (MessageQueue) source;
Message msg = mq.EndReceive(asyncResult.AsyncResult);
// display message on the screen
Console.WriteLine("Message: " + (string)msg.Body);
// start another asynchronous receive
mq.BeginReceive(); }
// add an event handler for the ReceiveCompleted event
mq.ReceiveCompleted += new
ReceiveCompletedEventHandler(MyReceive);
// Begin the asynchronous receive
mq.BeginReceive();
Tecnologias de messaging (MSMQ)
• Transacções
// create a transaction and start it
MessageQueueTransaction trans = new MessageQueueTransaction(); trans.Begin();
// open a message queue
MessageQueue mq = new MessageQueue(queueName);
// create the message
Message msg = new Message(…);
// send the message as part of the transaction
mq.Send(msg, trans);
// commit the transaction
• Acknowledgments
// open a message queue
MessageQueue mq = new MessageQueue(queueName);
// create the message
Message msg = new Message(…);
// we want a acknowledgement if received or not
Msg.AcknowledgeType = AcknowledgeTypes.FullReceive;
Msg.AdministrationQueue = new MessageQueue(adminQueue);
// send the message
mq.Send(Msg);
Tecnologias de messaging (MSMQ)
• Acknowledgments
– tipos de ack que podem ser usados em
Message.AcknowledgeType
• PositiveArrival • PositiveReceive
• NegativeReceive (se a mensagem ficar na fila)
• NotAcknowledgeReachQueue (se não chegar à fila)
• NotAcknowledgeReceive (quando o tempo expira)
• FullReachQueue (se chegou à fila, sim ou não)
– o body da mensagem é formatado em XML
(default) ou binário
– a propriedade Formatter da mensagem é
XmlMessageFormatter
ou
BinaryMessageFormatter– mas… o
XmlMessageFormatternão adivinha o tipo de
dados que foi serializado
– é necessário definir o
TargetTypedo
XmlMessageFormatter• isto é feito antes de receber a mensagem
Tecnologias de messaging (MSMQ)
• Um pormenor que não foi mencionado antes
// open a message queue
MessageQueue mq = new MessageQueue(queueName);
// the target type we have stored in the message body
System.Type[] types = new Type[] { typeof(Order) }; mq.Formatter = new XmlMessageFormatter(types);
// receive and convert message
Message msg = mq.Receive(); Order ord = (Order) msg.Body;
• Exemplo
– pretende-se transmitir uma ordem de compra (PurchaseOrder) para um certo produto, quantidade, e com a data actual – há 2 aplicações: uma que envia, outra que
recebe
– há 1 fila privada para ordens de compra chamada purchaseorders PurchaseOrder Product : string Quantity : int Date: DateTime SendPO purchaseorders PO ReceivePO
Tecnologias de messaging (MSMQ)
1. Instalar os componentes MSMQ
– verificar que os serviços MSMQ estão a correr
Tecnologias de messaging (MSMQ)
2. Criar a fila para as ordens de compra
2. Criar a fila para as ordens de compra
– criar uma nova fila privada
Tecnologias de messaging (MSMQ)
2. Criar a fila para as ordens de compra
– criar projecto C# (class library) no Visual Studio – definir uma nova classe
public class PurchaseOrder {
public string Product { get; set; } public int Quantity { get; set; } public DateTime Date { get; set; } // construtor
public PurchaseOrder() { Date = DateTime.Now; } }
Tecnologias de messaging (MSMQ)
4. Criar a aplicação SendPO
– criar projecto C# (console application) no Visual Studio – adicionar referência ao projecto da PurchaseOrder – adicionar referência para a assembly System.Messaging
4.
Criar a aplicação SendPO
– escrever o código da aplicação using System.Messaging;
PurchaseOrder PO = new PurchaseOrder(); PO.Product = ...
PO.Quantity = ...
MessageQueue mq = new MessageQueue(@".\private$\purchaseorders"); Message msg = new Message(PO);
mq.Send(msg, "PurchaseOrder");
body da mensagem
label da mensagem
fila
Tecnologias de messaging (MSMQ)
5. Criar a aplicação ReceivePO
– criar projecto C# (console application) no Visual Studio – adicionar referência ao projecto da PurchaseOrder – adicionar referência para a assembly System.Messaging
– escrever o código da aplicação using System.Messaging;
MessageQueue mq = new MessageQueue(@".\private$\purchaseorders"); System.Type[] types = new Type[] { typeof(PurchaseOrder) };
mq.Formatter = new XmlMessageFormatter(types); Message msg = mq.Receive();
PurchaseOrder PO = (PurchaseOrder)msg.Body;