8/28/2003 José Alves Marques
Filas de Mensagens
Message Oriented Middleware - MOM
Departamento de Engenharia Informática
Razões para usar Filas de Mensagens
• Comunicação
– Permite que a comunicação se processe mesmo quando
o servidor não está conectado à rede
– Funcionamento assíncrono permite distribuir carga e
ganhar eficiência
• Modelos de Comunicação
– Modelo de comunicação diferente:
publicação/subscrição
– Permite modelos de comunicação 1 para muitos e
muitos para muitos.
8/28/2003 José Alves Marques
Aspectos negativos a considerar
• A comunicação assíncrona implica um modelo de
programação mais difícil (programação por
eventos).
• Os servidores de filas de mensagens são mais um
custo de investimento e de suporte
Departamento de Engenharia Informática
Emissor
Emissor
Emissor
Emissor
Receptor
Receptor
Receptor
Receptor
fila
fila
fila
fila
Rede
8/28/2003 José Alves Marques
Integração por Mensagens – Message Oriented
Middleware
•
A integração é feita através do encaminhamento de informação (mensagens) entre os
sistemas.
•
As aplicações recebem e enviam as mensagens para um servidor central (broker).
•
As mensagens uma vez recebidas pelo broker podem ser reformatadas, combinadas ou
modificas por forma a serem entendidas pelo sistema de destino.
•
Normalmente não é necessário modificar os sistemas envolvidos. Os Message Brokers
fornecem adaptadores para as aplicações mais comuns (SAP, Baan, PeopleSoft, etc.).
Departamento de Engenharia Informática
Objectivos Genéricos dos MOM
•
Store and forward
•
Broker de mensagens
•
Subscrição e Publicação
•
Garantia de entrega
•
Sequência de mensagens
•
Routing simbólico
•
Funcionamento em Pedido-Resposta
•
Mensagens de eventos
•
Transformação de mensagens
•
Destinos ad-hoc
•
Resolução de excepções
•
Normalização
•
Transferência de ficheiros
•
Segurança
8/28/2003 José Alves Marques
Características MOM (I)
• Store Forward
– A mensagem deve ser aceite pelo serviço de mensagens e e armazenada
até que o receptor ou receptores estejam disponíveis para a receberem
– O emissor deve ser imediatamente desbloqueado depois da mensagem ter
sido aceite para envio (funcionamento assíncrono)
– As Mensagens são armazenadas de forma persistente pelo middleware
• Broker de mensagens
– Para além de uma comunicação ponto-a-ponto, o sistema efectua a
distribuição de mensagens permitindo o envio de mensagens de uma
aplicação para um conjunto de outras que se executam em diversos
sistemas.
• Subscrição e Publicação
– O modelo de comunicação é organizado em torno de tópicos. Os
receptores interessados subscrevem o tópico e recebem todas as
mensagens ou aplicam um filtro de selecção
Departamento de Engenharia Informática
8/28/2003 José Alves Marques
Características MOM (II)
• Garantia de entrega
– O mecanismo deve garantir a entrega da mensagem ao receptor(es)
– A entrega deve ser exactamente uma vez (não pode ser duplicada)
– A aplicação que envia a mensagem tem esta garantia de qualidade
de serviço pelo que não necessita de verificar a entrega
• Sequência das mensagens
– A sequência de envio das mensagens de um emissor deve ser
respeitada, garantido a ordenação dos acontecimentos que as
mensagens representam.
– Evita que as aplicações se preocupem com a ordem.
• Routing simbólico
– O endereçamento das mensagens baseia-se em nomes simbólicos
virtualizando a rede de comunicações
Departamento de Engenharia Informática
Características MOM (III)
• Pedido-resposta
– Muitas interacções baseiam-se num pedido e numa resposta.
Comportamento que á a base da chamada remota de procedimentos
– O emissor poderia especificar o endereço de resposta mas este estaria
dependente da organização da rede. A infraestrutura pode encarregar-se de
fazer o emparelhamento, permitindo que a resposta provenha de uma outra
aplicação
• Eventos
– Assinalam acontecimento que podem ter origem dentro ou fora do sistema
– Permitem alterar o fluxo dos processos
• Transformação de mensagens
– Possibilidade de aceitar mensagens com formatos predefinidos e
transformá-las para o formato do receptor.
– Permite que as integrações não estejam dependentes de um formato de
aplicações herdadas
8/28/2003 José Alves Marques
Pipelines
Decrypt
Decrypt ParseParse ResolveResolve Party Party
Message
Message
Box
Box
SerializeSerialize SignSign
Encrypt
Encrypt
Transporte
Transporte
Transporte
Transporte
Pipeline Recepção
Pipeline Envio
Orquestração
Departamento de Engenharia Informática
Características MOM (IV)
• Resolução de excepções
– A infraestrutura deve tentar tratar os erros habituais como os de
comunicação
– Deve assinalar os acontecimentos que envolvam quebra da semântica:
impossível de entregar, “exactamente –uma-vez” não respeitado, etc.
• Transferência de ficheiros
– A maioria das mensagens devem ser relativamente pequenas, contudo a
infra-estrutura deve poder enviar ficheiros de dimensão grande entre
aplicações porque muitas integrações são feitas com ficheiros
• Segurança
– A segurança tem de ser considerada a dois níveis
• Dentro da organização
• Com sistemas externos
8/28/2003 José Alves Marques
Exemplo de MOM
Java Messages
Departamento de Engenharia Informática
Java Messaging Service - JMS
• Elementos da infraestrutura
– Filas de mensagens
– Envio e recepção de mensagens
• Mensagens ponto a ponto
• Subscrição e publicação de mensagens
– Formato das Mensagens
– API em Java
8/28/2003 José Alves Marques
Envio e Recepção de Mensagens
• As aplicações falam com o message broker através de uma
connection
• Dentro de uma connection um processo pode ter várias
sessions para cada uma das suas tarefas (threads)
• As mensagens podem ser:
– Stream – sequência de tipos básicos de Java
– Texto – na qual se incluem documentos XML
– Objectos – objectos Java serializados
– Bytes
Departamento de Engenharia Informática
Envio das Mensagens
• Ponto a Ponto
– A designação pode confundir. Neste caso quer dizer que a
aplicação define a queue para onde envia a mensagem.
– A aplicação deve obter a referência para a queue através de um
serviço de nomes (JNDI)
– O sistema passa automaticamente a referência para a queue de
resposta
• Publicar e Subscrever
– As mensagens não são enviadas para um destinatário mas para um
tópico
– As mensagens podem ser consideradas eventos que são
comunicados aos destinatários interessados no tópico
– O subscritor do tópico pode ser durable, caso em que as mensagens
são armazenadas enquanto está inactivo
8/28/2003 José Alves Marques
Filas de mensagens e transacções
• A garantia de entrega é assegurada pelas filas de mensagens serem
persistentes
• Para assegurar a semântica exactamente-uma–vez as JMS queues
podem ser opcionalmente transaccionais (transacted) através de um
parâmetro na criação da sessão
• O transaccional existe quer do lado do envio quer da recepção.
– No envio a mensagem só é considerada como estando na fila quando a
aplicação faz commit
– Na recepção, se a aplicação ou o commit falham a mensagem permanece
na fila até a aplicação a voltar a ler.
• Uma Session está sempre associada a uma transacção corrente, não há
begin; commit e rollback porque uma transacção automaticamente
começa outra
• O JMS não implementa transacções distribuídas
Departamento de Engenharia Informática
Formato da Mensagem
• O JMS não define uma
norma para as
mensagens pelo que
produtos do tipo JMS
podem ter formatos
diferentes
• Mas define um
formato de mensagem
abstracto que define a
informação que deve
existir numa
8/28/2003 José Alves Marques
API do JMS
• Modelo de objectos que considera:
– Queue connection factory
– Queue Connection
– Queue session – uma para cada thread
• Modelo
• Encontrar uma ConnectionFactory através do JNDI
• Encontrar uma Destination através do JNDI
• Usar a Connection Factory para criar uma Connection
• Usar a Connection para criar uma ou mais Sessions
• Usar a Session e a Destination para criar o MessageProducer e
MessageConsumer
• Iniciar a Connection
Departamento de Engenharia Informática Application Queue ConnectionFactory ConnectionQueue SessionQueue MessageText Queue Sender ReceiverQueue
createQueueConnection createQueueSession createSender (queue) createReceiver (queue) Start() creatTextMessage () setText(messagetext) Send(message) Receive()
8/28/2003 José Alves Marques
Exemplo JMS(I)
public class Hello {public static void main(String[] args) { try {
/* Declaração das variáveis JMS */
QueueConnectionFactory queueConnectionFactory = null; QueueConnection queueConnection = null;
Queue queue = null;
QueueSession queueSession = null; QueueSender queueSender = null; QueueReceiver queueReceiver = null; TextMessage textMessage = null; Message message = null;
/* Declaração de variáveis para argumentos da linha de comando */ final String MQ_HOST_NAME;
final String MQ_HOST_PORT;
/* Validação dos argumentos recebidos na linha de comando */ if ( args.length < 2 ) {
Definição da localização do
Message broker
Departamento de Engenharia Informática
Exemplo JMS(II)
System.out.println("Usage: java Hello <mq_host_name> <mq_host_port>"); System.exit(1);
}
MQ_HOST_NAME = args[0]; MQ_HOST_PORT = args[1];
System.out.println("Message queue host is " + MQ_HOST_NAME + ":" + MQ_HOST_PORT);
/* Instanciação de uma fábrica de ligações */
/* Instancia-se directamente a classe Sun MQ para poder usar os métodos para definir nome e porto do servidor de mensagens */
com.sun.messaging.QueueConnectionFactory sunQueueConnectionFactory = new com.sun.messaging.QueueConnectionFactory();
sunQueueConnectionFactory.setProperty("JMQBrokerHostName", MQ_HOST_NAME); sunQueueConnectionFactory.setProperty("JMQBrokerHostPort", MQ_HOST_PORT); queueConnectionFactory = sunQueueConnectionFactory;
/* Criação de uma ligação ao servidor de mensagens */
queueConnection = queueConnectionFactory.createQueueConnection();
/* Criação de uma sessão dentro da ligação estabelecida */
queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Indica que a Session não é Transaccional
8/28/2003 José Alves Marques
Exemplo JMS(III)
/* Instanciação de uma fila de mensagens com o nome especificado */ /* A fila é criada implicitamente no servidor, caso não exista */ queue = new com.sun.messaging.Queue("world");
/* Criação do produtor de mensagens */
queueSender = queueSession.createSender(queue); /* Criação e envio de uma mensagem */
textMessage = queueSession.createTextMessage(); textMessage.setText("Hello World");
System.out.println("Sending Message: " + textMessage.getText()); queueSender.send(textMessage);
/* Neste exemplo muito simples é o mesmo programa a enviar e a receber a mensagem */
/* Criação de um consumidor de mensagens a partir da fila */ queueReceiver = queueSession.createReceiver(queue);
Departamento de Engenharia Informática
Exemplo JMS(IV)
/* Reiniciação da ligação */queueConnection.start();
/* Recepção de mensagem e análise do conteúdo */
message = queueReceiver.receive();
if (message instanceof TextMessage) { textMessage = (TextMessage) message;
System.out.println("Read Message: " + textMessage.getText()); }
/* Fecho da sessão e da ligação */ queueSession.close();
queueConnection.close(); } catch (Exception e) {
/* À falta de melhor tratamento de erro, é pelo menos conveniente imprimir a excepção */ System.out.println("Exception occurred : " + e.toString());
}
System.out.println("Finished"); }
8/28/2003 José Alves Marques
Exemplo: receptor Assíncrono (I)
public class AsynchReceiver {public static void main(String[] args) { int exitResult = 0;
String queueName = null;
/* Declaração das variáveis JMS */
QueueConnectionFactory queueConnectionFactory = null; QueueConnection queueConnection = null;
QueueSession queueSession = null; Queue queue = null;
QueueReceiver queueReceiver = null; TextListener textListener = null;
/* Declaração de variáveis para argumentos da linha de comando */ final String MQ_HOST_NAME;
final String MQ_HOST_PORT;
/* Validação dos argumentos recebidos na linha de comando */ if (args.length != 3) {
System.out.println("Usage: java AsynchReceiver <mq_host_name> <mq_host_port> <queue_name>");
System.exit(1);
Departamento de Engenharia Informática
Exemplo: receptor Assíncrono (II)
MQ_HOST_NAME = args[0];MQ_HOST_PORT = args[1];
System.out.println("Message queue host is " + MQ_HOST_NAME + ":" + MQ_HOST_PORT); queueName = new String(args[2]);
System.out.println("Queue name is " + queueName); /* Criar uma fábrica de ligações,
criar uma ligação,
criar uma sessão a partir da ligação (false indica que não é transaccional), criar uma fila de mensagens */
try { com.sun.messaging.QueueConnectionFactory sunQueueConnectionFactory = new com.sun.messaging.QueueConnectionFactory(); sunQueueConnectionFactory.setProperty("JMQBrokerHostName", MQ_HOST_NAME); sunQueueConnectionFactory.setProperty("JMQBrokerHostPort", MQ_HOST_PORT); queueConnectionFactory = sunQueueConnectionFactory; queueConnection = queueConnectionFactory.createQueueConnection(); queueSession = queueConnection.createQueueSession(false,
8/28/2003 José Alves Marques
Exemplo: receptor Assíncrono (III)
} catch (Exception e) {System.out.println("Connection problem: " + e.toString()); if (queueConnection != null) {
try {
queueConnection.close(); } catch (JMSException ee) { }
}
System.exit(1); }
/* Criar consumidor de mensagens,registar o tratamento de mensagens (TextListener) e iniciar a recepção de mensagens. O 'listener' escreve as mensagens obtidas. O programa fica bloqueado até o 'listener' receber a mensagem final e efectuar o desbloqueio. */
try {
queueReceiver = queueSession.createReceiver(queue); textListener = new TextListener();
queueReceiver.setMessageListener(textListener);
/* Iniciar a ligação */ queueConnection.start();
/* Aqui o programa está livre para ir fazer qualquer outra coisa
Departamento de Engenharia Informática
Exemplo: receptor Assíncrono (IV)
/* Quando não houver mais nada para fazer,vai bloquear-se para esperar o fim da recepção de mensagens */ textListener.monitor.waitTillDone();
} catch (JMSException e) {
System.out.println("Exception occurred: " + e.toString()); exitResult = 1; } finally { if (queueConnection != null) { try { queueConnection.close(); } catch (JMSException e) { exitResult = 1; } } } System.out.println("Finished"); System.exit(exitResult); } }
8/28/2003 José Alves Marques
Função que trata as mensagens assíncronas
public class TextListener implements MessageListener {final DoneLatch monitor = new DoneLatch();
/* método invocado no Listener de mensagens quando chega uma mensagem nova */ public void onMessage(Message message) {
if (message instanceof TextMessage) { TextMessage msg = (TextMessage) message; try {
System.out.println("Reading message: " + msg.getText()); } catch (JMSException e) {
System.out.println("Exception in onMessage(): " + e.toString()); }
} else {
/* A mensagem que não é de texto indica o fim da sequência. Acorda quem esteja à espera */
monitor.allDone(); }
} }
Departamento de Engenharia Informática
8/28/2003 José Alves Marques
Microsoft Message Queues
Departamento de Engenharia Informática
MSMQ - História
• MSMQ was designed and developed by a Microsoft developement
team in Haifa, Israel.
• MSMQ version 1.0 was shipped with the NT Option pack.
– In this version MSMQ was integrated with SQL Server. The programming
model was easy but the Installation and management was cumbersome.
• MSMQ version 2.0 shipped as an optional windows component with
Windows 2000.
– Active Directory was born, MSMQ was quick to grab the opportunity to
replace SQl-server dependency with AD.
• MSMQ version 3.0 shipped as an optional windows component with
WinXP and Windows 2003.
– Major new features like HTTP protocol support, Multicasting support,
Distribution lists, etc were introduced. Security and reliability of the
product was greatly enhanced in version 3.0
8/28/2003 José Alves Marques
Microsoft Message Queues
Envio da mensagem
MessageQueue MyMessageQ; Message MyMessage;
MyMessageQ = new MessageQueue(txtQueuePath.Value); MyMessage = new Message(txtMessageToSend.Value); MyMessageQ.Send(MyMessage);
Recepção da Mensagem
MessageQueue MyMessageQ; Message MyMessage;MyMessageQ = new MessageQueue(QueuePath); MyMessage = MyMessageQ.Receive;
WriteStatus("Message Received!"); DoSomeLongRunningProcess(); WriteStatus("Processing Finished!");
Departamento de Engenharia Informática
8/28/2003 José Alves Marques
Enterprise Application Integration
Departamento de Engenharia Informática
8/28/2003 José Alves Marques
EAI na Arquitectura Tecnológica
Cap 10
Departamento de Engenharia Informática
EAI baseado em Filas de Mensagens
•
Agregam as funcionalidades dos message
brokers com a possibilidade de execução
de processos de negócio transversais às
várias aplicações, dentro e fora de uma
organização.
•
A arquitectura integração por camadas
típica compreende serviços comuns
(segurança, repositório, etc.), um bus de
mensagens, adaptadores, transformação
de mensagens, gestão de processos e
portais de informação.
8/28/2003 José Alves Marques
Funcionalidade “típica” de um EAI
• Armazenamento de mensagens – Guarda persistentemente as
mensagens que chegam ao message broker. Dá suporte a mining de
mensagens, armazenamento de mensagens e auditorias.
• Transformação de mensagens – Converte uma mensagem de entrada
para um formato que permita ser enviada para outro sistema.
• Processamento de regras – Permite definir regras utilizadas no
processamento e encaminhamento das mensagens.
• Re-encaminhamento inteligente – Capacidade de re-enviar uma
mensagem de acordo com o seu conteúdo e a sua origem.
• Serviços de repositório – Mantém informação sobre as aplicações de
origem e destino das mensagens.
• Adaptadores – Camada de software que faz a ligação entre o message
broker e as aplicações mais habituais
Departamento de Engenharia Informática
8/28/2003 José Alves Marques Technology Adapter Technology Adapter
Messaging Bus
Messaging Bus
Routing Services
Routing Services
Declarative RoutingDeclarative Routing Content BasedContent Based Publish/SubscribePublish/Subscribe Application Adapter
Application Adapter
Biztalk - Architectural Overview
Receive Services
Receive Services
HTTPHTTP SMTPSMTP MSMQMSMQ MQSeriesMQSeries File File WebWeb Service
Service
Application A
Application A Application BApplication B Application CApplication C
Application D
Application D Application EApplication E Application FApplication F Application Adapter Application Adapter