Message Driven Beans. Apresentação. Introdução Implementação de MDBs Deployment no JBoss Java Messaging Service Exemplo

Tamanho: px
Começar a partir da página:

Download "Message Driven Beans. Apresentação. Introdução Implementação de MDBs Deployment no JBoss Java Messaging Service Exemplo"

Transcrição

1 Message Driven Beans Apresentação Introdução Implementação de MDBs Deployment no JBoss Java Messaging Service Exemplo 1

2 Introdução Message Driven Beans são EJBs que consomem mensagens enviadas para filas ou tópicos Aplicações clientes enviam mensagens para filas ou tópicos As mensagens são processadas de forma assíncrona Não há acoplamento entre a aplicação cliente e o MDB A aplicação cliente somente sabe o nome da fila ou do tópico e o que a mensagem deve conter Filas e Tópicos Uma mensagem enviada para uma fila será recebida por um Message Driven Bean que estiver escutando a fila Uma mensagem enviada para um tópico será recebida por todos os Message Driven Beans que estiverem escutando o tópico 2

3 Implementação de Message Driven Beans (1) Criação de uma classe Java que: implementa as interfaces: MessageListener; e MessageDrivenBean; estende EnterpriseBean possui os métodos: ejbcreate(), ejbremove(), setmessagedrivencontext(messagedrivencontext ctx) e onmessage(message m) Implementação de Message Driven Beans (2) Um MDB Não retorna exceções ao cliente Não possui estado Não participa de contexto transacional iniciado no cliente Possui apenas um método onmessage() para o recebimento de todos os tipos de mensagem 3

4 Exemplo de Message Driven Bean public class MeuMDB implements MessageDrivenBean, MessageListener { private MessageDrivenContext ctx; public void ejbcreate() { public void ejbremove() { public void setmessagedrivencontext(messagedrivencontext ctx) { this.ctx = ctx; public void onmessage(message msg) { Deployment no JBoss JBoss contém servidor de filas JBossMQ MDBs são empacotados junto com os outros EJBs Inclusão nos arquivos ejb-jar.xml e jboss.xml 4

5 Inclusão no Arquivo ejbjar.xml (1) <ejb-jar> <enterprise-beans>... <message-driven> <display-name>meumdb</display-name> <ejb-name>meumdb</ejb-name> <ejb-class>com.empresa.pacote.meumdb</ejb-class> <transaction-type>container</transaction-type> <message-driven-destination> <destination-type>javax.jms.queue</destination-type> </message-driven-destination> </message-driven>... </enterprise-beans> Inclusão no Arquivo ejbjar.xml (2) <assembly-descriptor>... <container-transaction> <method> <ejb-name>meumdb</ejb-name> <method-name>*</method-name> </method> <trans-attribute>required</trans-attribute> </container-transaction>... </assembly-descriptor> </ejb-jar> 5

6 Inclusão no Arquivo jboss.xml <jboss> <enterprise-beans>... <message-driven> <ejb-name>meumdb</ejb-name> <destination-jndi-name> queue/minhafila </destination-jndi-name> </message-driven>... </enterprise-beans> </jboss> Java Messaging Service Aplicações cliente utilizam JMS para enviar mensagens para filas e tópicos API independente do message oriented middleware utilizado 6

7 Exemplo de Envio de Mensagem //... QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup( ConnectionFactory ); QueueConnection conn = factory.createqueueconnection(); QueueSession session = conn.createqueuesession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = (Queue) ctx.lookup( queue/minhafila ); QueueSender sender = session.createsender(queue); MapMessage msg = session.createmapmessage(); msg.setstring( campo1, valor1 ); sender.send(msg); sender.close(); session.close(); conn.close(); //... Tipos de Mensagens TextMessage: para o envio de mensagens simples MapMessage: para o envio de mensagens com vários parâmetros, ideal para aplicações Web com parâmetros do usuário ObjectMessage: para o envio de objeto serializado BytesMessage: para o envio de dados binários 7

8 Exemplo Aplicação cliente que envia um objeto para uma fila (com serialização) e MDB que recebe o objeto (como uma mensagem) e chama um método do objeto Classe Serializável import java.io.*; public class ClasseSimples implements Serializable { private String nome; public String getnome() { return nome; public ClasseSimples(String nome) { this.nome = nome; 8

9 MDB (1) import javax.ejb.*; import javax.jms.*; import javax.naming.*; public class MDBExemplo implements MessageDrivenBean, MessageListener { private MessageDrivenContext ctx; public void ejbcreate() { public void ejbremove() { public void setmessagedrivencontext(messagedrivencontext ctx) { this.ctx = ctx; MDB (2) public void onmessage(message msg) { try { if (msg instanceof ObjectMessage) { ClasseSimples c = (ClasseSimples) ((ObjectMessage) msg).getobject(); System.out.println("MDBExemplo: Recebi um objeto - " + c.getnome()); catch (Exception e) { throw new EJBException(e); 9

10 Cliente (1) import javax.jms.*; import javax.naming.*; public class Cliente { public static void main(string[] args) throws Exception { Context ctx = new InitialContext(); QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("connectionfactory"); QueueConnection conn = factory.createqueueconnection(); QueueSession session = conn.createqueuesession(false, Session.AUTO_ACKNOWLEDGE); Queue queue = (Queue) ctx.lookup("queue/filaexemplo"); Cliente (2) QueueSender sender = session.createsender(queue); ObjectMessage msg = session.createobjectmessage( new ClasseSimples("Objeto criado pelo cliente")); sender.send(msg); sender.close(); session.close(); conn.close(); 10

11 ejb-jar.xml (1) <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" " <ejb-jar> <enterprise-beans> <message-driven> <display-name>mdbexemplo</display-name> <ejb-name>mdbexemplo</ejb-name> <ejb-class>mdbexemplo</ejb-class> <transaction-type>container</transaction-type> <message-driven-destination> <destination-type>javax.jms.queue</destination-type> </message-driven-destination> </message-driven> </enterprise-beans> ejb-jar.xml (2) <assembly-descriptor> <container-transaction> <method> <ejb-name>mdbexemplo</ejb-name> <method-name>*</method-name> </method> <trans-attribute>required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar> 11

12 jboss.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS//EN" " <jboss> <enterprise-beans> <message-driven> <ejb-name>mdbexemplo</ejb-name> <destination-jndi-name> queue/filaexemplo </destination-jndi-name> </message-driven> </enterprise-beans> </jboss> application.xml <?xml version="1.0" encoding="iso "?> <application> <display-name>mdbexemplo</display-name> <module> <ejb>mdbexemplo.jar</ejb> </module> </application> 12

13 Trabalho Fazer uma apresentação sobre o funcionamento e utilização do JMS Incluir um exemplo completo do modelo Publish and Subscribe com seleção e filtragem de mensagens Não considerar MDB Material a ser entregue: Apresentação Exercício completo com build file ant 13