SlideShare ist ein Scribd-Unternehmen logo
1 von 13
Downloaden Sie, um offline zu lesen
J530 - Enterprise JavaBeans

Message-driven
Beans
Helder da Rocha (helder@acm.org)

argonavis.com.br
1
O que é um Message-Driven Bean
Bean guiado por mensagens, ou eventos
Um event-handler distribuído em forma de EJB

MDBs consomem mensagens enviadas a filas e canais JMS
Não é possível enviar uma mensagem diretamente a um messagedriven bean (envia-se mensagens a um canal que o bean escuta)
Acoplamento entre clientes e MDB resume-se à conhecimento de
canal comum de comunicações

Um message-driven bean é um EJB mas
Não possui interfaces Home ou Remote
Possui apenas um método que recebe qualquer tipo de mensagem
Não devolve tipos ou exceções ao cliente
Não participa de contexto transacional iniciado no cliente
Não possui estado (é stateless)
Pode ser ouvinte de uma fila ou assinante durável ou não-durável
de um canal (Topic) JMS
2
Desenvolvendo MDB
Message-driven beans implementam duas interfaces
public interface javax.jms.MessageListener
public interface javax.ejb.MessageDrivenBean
extends javax.ejb.EnterpriseBean

Métodos de MessageDrivenBean e da especificação

ejbRemove(): método da interface. Chamado pelo container

quando o message-driven bean está sendo removido do pool
ejbCreate(): método definido na especificação (não está na
interface). É chamado quando um novo bean é criado pelo container
setMessageDrivenContext(MessageDrivenContext ctx):
método da interface. Chamado antes do ejbCreate() quando o bean
está sendo adicionado ao pool

Método de MessageListener

onMessage(Message m): chamado cada vez que uma mensagem é

enviada para o canal do bean (se o bean estiver ativado).
3
Exemplo: implementação de um MDB
import javax.ejb.*;
import javax.jms.*;
public class LogBean implements MessageDrivenBean, MessageListener {
protected MessageDrivenContext ctx;
public void setMessageDrivenContext(MessageDrivenContext ctx) {
this.ctx = ctx;
Métodos da interface
}
MessageDrivenBean ou do
public void ejbCreate() {}
contrato com a especificação
public void ejbRemove() {}
public void onMessage(Message msg) {
Método da interface
TextMessage tm = (TextMessage) msg;
MessageListener
try {
String text = tm.getText();
System.err.println("Received new message : " + text);
} catch (JMSException e) {
throw new EJBException();
}
Este bean simplesmente
}
}

RuntimeException para container capturar!
Só faça isto se houver chance de corrigir erro: falta
de acknowledgement pode causar loop infinito!

imprime o texto contido na
mensagem recebida

4
Ciclo de Vida
Ciclo de vida muito simples
Apenas dois estados
Bean não existe

1. Objeto criado
2. setMessageDrivenContext()
3. ejbCreate()

Apenas o container chama
os métodos de um
Message-driven Bean

ejbRemove()

Pool de beans
onMessage()

Fonte: [1]

5
Deployment Descriptor
<ejb-jar>
<enterprise-beans>
<message-driven>
<ejb-name>LogEJB</ejb-name>
<ejb-class>examples.LogBean</ejb-class>
<transaction-type>Container</transaction-type>

Canal (apenas a classe e tipo)
<message-driven-destination>
<destination-type>javax.jms.Topic</destination-type>
<subscription-durability>NonDurable</subscription-durability>
</message-driven-destination>
</message-driven>
</enterprise-beans>
</ejb-jar>

Usado apenas em Topics

6
Outros sub-tags de <message-driven>
<message-selector>
Usado para incluir um filtro SQL para cabeçalhos de
mensagens. Apenas mensagens que combinarem com o
filtro serão recebidas pelo bean. Exemplo:
<message-selector><![CDATA[
Formato LIKE '%Imagem%'
AND JMSExpiration > 0
AND Valor IS NOT NULL
]]></message-selector>

<acknowledge-mode>
Permite definir o modo de acknowledgment. Pode ser
Auto-acknowledge ou Dups-ok-acknowledge. O último
permite o recebimento de mensagens duplicadas
Client-acknowledge não é suportado

7
Vendor-specific: JBoss
Os nomes JNDI dos recursos que serão acessados globalmente
são definidos na configuração do fabricante.
No JBoss:
Nome JNDI global do destino
<jboss>
<enterprise-beans>
compartilhado pelo bean
<message-driven>
e pelos clientes
<ejb-name>LogEJB</ejb-name>
<destination-jndi-name>
topic/testTopic
</destination-jndi-name>
</message-driven>
</enterprise-beans>
Referência do ENC
java:comp/env
<resource-managers>
<resource-manager>
<res-name>jms/logtopic</res-name>
<res-jndi-name>topic/testTopic</res-jndi-name>
</resource-manager>
</resource-managers>
</jboss>
Mapeamento do nome do
ENC para nome JNDI global

8
Cliente é um cliente JMS comum
Pode ser outro bean, cliente Web ou standalone
public class Client {
public static void main(String[] args) throws Exception {
Context ctx = new InitialContext(System.getProperties());
TopicConnectionFactory factory =
(TopicConnectionFactory) ctx.lookup("ConnectionFactory");
TopicConnection connection =
factory.createTopicConnection();
Cliente externo (fora
TopicSession session =
do ENC) usa nomes
connection.createTopicSession(
JNDI globais
false, Session.AUTO_ACKNOWLEDGE);
Topic topic = (Topic) ctx.lookup("topic/testTopic");
TopicPublisher publisher = session.createPublisher(topic);
TextMessage msg = session.createTextMessage();
msg.setText("This is a test message.");
publisher.publish(msg);
}
}

9
Execução dos exemplos
Diretório cap10/exemplos/mejb2/
Para montar e instalar a aplicação, use
> ant jboss.deploy

Uma vez instalada, rode o cliente:
> ant run.jboss.client

A execução não deve causar nenhuma reação no
cliente, já que foi assíncrona "one-way".
No servidor, aparece a mensagem enviada:
[STDERR] Received new message : This is a test message.

Veja também o exemplo do J2EE Tutorial (usando
Queue) no subdiretório cap10/exemplos/sun/

10
Exercício
1. Implemente um bean que receba as mensagens
enviadas pelo cliente que você desenvolveu no
capítulo anterior
O nome JNDI da fila é queue/A
O bean deve filtrar as mensagens e receber apenas
aquelas cujo cabeçalho Quantidade contiver mais que
200 itens e menos que 400

2. Faça com que o Session Bean AdminLoja envie
mensagens que serão recebidas por este bean
Defina a referência loja/jms/operacoes como o nome da
fila no ENC (java:comp/env)
Mapeie o nome a fila queue/A do JBoss
11
Fontes
[1] Ed

Roman. Mastering EJB 2. Chapter 8 - Introduction to
Message Driven beans.
[2] J2EE Tutorial. Message-driven Beans.
[3] Monson-Haefel. Enterprise JavaBeans. Chapter 13 Message-driven beans.

12
Curso J530: Enterprise JavaBeans
Revisão 2.0 - Junho de 2003

© 2001-2003, Helder da Rocha
(helder@acm.org)

argonavis.com.br
13

Weitere ähnliche Inhalte

Ähnlich wie MDBs: Entendendo Beans Guiados por Mensagens em EJB

Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Gilberto Holms
 
Design builder em testes
Design builder em testesDesign builder em testes
Design builder em testesTestRock!
 
Abrindo a caixa de ferramentas: atirando pedras com Jmeter
Abrindo a caixa de ferramentas: atirando pedras com JmeterAbrindo a caixa de ferramentas: atirando pedras com Jmeter
Abrindo a caixa de ferramentas: atirando pedras com JmeterEvandro Grezeli
 
Maratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESBMaratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESBDextra
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Helder da Rocha
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusDenis L Presciliano
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSSistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSAdriano Teixeira de Souza
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusDenis L Presciliano
 

Ähnlich wie MDBs: Entendendo Beans Guiados por Mensagens em EJB (20)

Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5Resumo Anotacoes Certificacao SCBCD 5
Resumo Anotacoes Certificacao SCBCD 5
 
Design builder em testes
Design builder em testesDesign builder em testes
Design builder em testes
 
J530 6 stateful
J530 6 statefulJ530 6 stateful
J530 6 stateful
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Abrindo a caixa de ferramentas: atirando pedras com Jmeter
Abrindo a caixa de ferramentas: atirando pedras com JmeterAbrindo a caixa de ferramentas: atirando pedras com Jmeter
Abrindo a caixa de ferramentas: atirando pedras com Jmeter
 
Model View Controller
Model View ControllerModel View Controller
Model View Controller
 
Maratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESBMaratona JBoss 2010 - JBoss-ESB
Maratona JBoss 2010 - JBoss-ESB
 
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
Curso de Enterprise JavaBeans (EJB) (JavaEE 7)
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
Testes em Aplicações Web com Cactus
Testes em Aplicações Web com CactusTestes em Aplicações Web com Cactus
Testes em Aplicações Web com Cactus
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Curso de Servlets
Curso de ServletsCurso de Servlets
Curso de Servlets
 
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMSSistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
Sistemas Distribuídos - Comunicacao Distribuida - Middleware - JMS
 
JAVABEANS.pdf
JAVABEANS.pdfJAVABEANS.pdf
JAVABEANS.pdf
 
Servlets
ServletsServlets
Servlets
 
MDB
MDBMDB
MDB
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Basico dovba excel_tutorial1
Basico dovba excel_tutorial1Basico dovba excel_tutorial1
Basico dovba excel_tutorial1
 
Cactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta CactusCactus - Testes em J2EE com Jakarta Cactus
Cactus - Testes em J2EE com Jakarta Cactus
 

Mehr von Denis L Presciliano

Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsDenis L Presciliano
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsDenis L Presciliano
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteDenis L Presciliano
 
Reuso com Herança e Composição
Reuso com Herança e ComposiçãoReuso com Herança e Composição
Reuso com Herança e ComposiçãoDenis L Presciliano
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntDenis L Presciliano
 
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoTipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoDenis L Presciliano
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Denis L Presciliano
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntDenis L Presciliano
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em JavaDenis L Presciliano
 

Mehr von Denis L Presciliano (20)

Funmentos de Objetos Remotos
Funmentos de Objetos RemotosFunmentos de Objetos Remotos
Funmentos de Objetos Remotos
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Como construir aplicações gráficas e applets
Como construir aplicações gráficas e appletsComo construir aplicações gráficas e applets
Como construir aplicações gráficas e applets
 
Classes internas
Classes internasClasses internas
Classes internas
 
Entrada e Saída
Entrada e SaídaEntrada e Saída
Entrada e Saída
 
Coleções Propriedade, Resources e Strings
Coleções Propriedade, Resources e StringsColeções Propriedade, Resources e Strings
Coleções Propriedade, Resources e Strings
 
Funcamentos de Programação Concorrente
Funcamentos de Programação ConcorrenteFuncamentos de Programação Concorrente
Funcamentos de Programação Concorrente
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
 
Interfaces e Porlimosfismo
Interfaces e PorlimosfismoInterfaces e Porlimosfismo
Interfaces e Porlimosfismo
 
Reuso com Herança e Composição
Reuso com Herança e ComposiçãoReuso com Herança e Composição
Reuso com Herança e Composição
 
Gerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache AntGerenciamento de projetos com o Apache Ant
Gerenciamento de projetos com o Apache Ant
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
Como criar classes e objetos
Como criar classes e objetosComo criar classes e objetos
Como criar classes e objetos
 
Tipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxoTipos, literais, operadoes e controle de fluxo
Tipos, literais, operadoes e controle de fluxo
 
Como usar a documentação da API Java 2
Como usar a documentação da API Java 2Como usar a documentação da API Java 2
Como usar a documentação da API Java 2
 
Configuração do ambiente JEdit + Ant
Configuração do ambiente JEdit + AntConfiguração do ambiente JEdit + Ant
Configuração do ambiente JEdit + Ant
 
Programação Orientada a objetos em Java
Programação Orientada a objetos em JavaProgramação Orientada a objetos em Java
Programação Orientada a objetos em Java
 
Introdução a tecnologia Java
Introdução a tecnologia JavaIntrodução a tecnologia Java
Introdução a tecnologia Java
 
Fundamentos de Sockets
Fundamentos de SocketsFundamentos de Sockets
Fundamentos de Sockets
 

MDBs: Entendendo Beans Guiados por Mensagens em EJB

  • 1. J530 - Enterprise JavaBeans Message-driven Beans Helder da Rocha (helder@acm.org) argonavis.com.br 1
  • 2. O que é um Message-Driven Bean Bean guiado por mensagens, ou eventos Um event-handler distribuído em forma de EJB MDBs consomem mensagens enviadas a filas e canais JMS Não é possível enviar uma mensagem diretamente a um messagedriven bean (envia-se mensagens a um canal que o bean escuta) Acoplamento entre clientes e MDB resume-se à conhecimento de canal comum de comunicações Um message-driven bean é um EJB mas Não possui interfaces Home ou Remote Possui apenas um método que recebe qualquer tipo de mensagem Não devolve tipos ou exceções ao cliente Não participa de contexto transacional iniciado no cliente Não possui estado (é stateless) Pode ser ouvinte de uma fila ou assinante durável ou não-durável de um canal (Topic) JMS 2
  • 3. Desenvolvendo MDB Message-driven beans implementam duas interfaces public interface javax.jms.MessageListener public interface javax.ejb.MessageDrivenBean extends javax.ejb.EnterpriseBean Métodos de MessageDrivenBean e da especificação ejbRemove(): método da interface. Chamado pelo container quando o message-driven bean está sendo removido do pool ejbCreate(): método definido na especificação (não está na interface). É chamado quando um novo bean é criado pelo container setMessageDrivenContext(MessageDrivenContext ctx): método da interface. Chamado antes do ejbCreate() quando o bean está sendo adicionado ao pool Método de MessageListener onMessage(Message m): chamado cada vez que uma mensagem é enviada para o canal do bean (se o bean estiver ativado). 3
  • 4. Exemplo: implementação de um MDB import javax.ejb.*; import javax.jms.*; public class LogBean implements MessageDrivenBean, MessageListener { protected MessageDrivenContext ctx; public void setMessageDrivenContext(MessageDrivenContext ctx) { this.ctx = ctx; Métodos da interface } MessageDrivenBean ou do public void ejbCreate() {} contrato com a especificação public void ejbRemove() {} public void onMessage(Message msg) { Método da interface TextMessage tm = (TextMessage) msg; MessageListener try { String text = tm.getText(); System.err.println("Received new message : " + text); } catch (JMSException e) { throw new EJBException(); } Este bean simplesmente } } RuntimeException para container capturar! Só faça isto se houver chance de corrigir erro: falta de acknowledgement pode causar loop infinito! imprime o texto contido na mensagem recebida 4
  • 5. Ciclo de Vida Ciclo de vida muito simples Apenas dois estados Bean não existe 1. Objeto criado 2. setMessageDrivenContext() 3. ejbCreate() Apenas o container chama os métodos de um Message-driven Bean ejbRemove() Pool de beans onMessage() Fonte: [1] 5
  • 6. Deployment Descriptor <ejb-jar> <enterprise-beans> <message-driven> <ejb-name>LogEJB</ejb-name> <ejb-class>examples.LogBean</ejb-class> <transaction-type>Container</transaction-type> Canal (apenas a classe e tipo) <message-driven-destination> <destination-type>javax.jms.Topic</destination-type> <subscription-durability>NonDurable</subscription-durability> </message-driven-destination> </message-driven> </enterprise-beans> </ejb-jar> Usado apenas em Topics 6
  • 7. Outros sub-tags de <message-driven> <message-selector> Usado para incluir um filtro SQL para cabeçalhos de mensagens. Apenas mensagens que combinarem com o filtro serão recebidas pelo bean. Exemplo: <message-selector><![CDATA[ Formato LIKE '%Imagem%' AND JMSExpiration > 0 AND Valor IS NOT NULL ]]></message-selector> <acknowledge-mode> Permite definir o modo de acknowledgment. Pode ser Auto-acknowledge ou Dups-ok-acknowledge. O último permite o recebimento de mensagens duplicadas Client-acknowledge não é suportado 7
  • 8. Vendor-specific: JBoss Os nomes JNDI dos recursos que serão acessados globalmente são definidos na configuração do fabricante. No JBoss: Nome JNDI global do destino <jboss> <enterprise-beans> compartilhado pelo bean <message-driven> e pelos clientes <ejb-name>LogEJB</ejb-name> <destination-jndi-name> topic/testTopic </destination-jndi-name> </message-driven> </enterprise-beans> Referência do ENC java:comp/env <resource-managers> <resource-manager> <res-name>jms/logtopic</res-name> <res-jndi-name>topic/testTopic</res-jndi-name> </resource-manager> </resource-managers> </jboss> Mapeamento do nome do ENC para nome JNDI global 8
  • 9. Cliente é um cliente JMS comum Pode ser outro bean, cliente Web ou standalone public class Client { public static void main(String[] args) throws Exception { Context ctx = new InitialContext(System.getProperties()); TopicConnectionFactory factory = (TopicConnectionFactory) ctx.lookup("ConnectionFactory"); TopicConnection connection = factory.createTopicConnection(); Cliente externo (fora TopicSession session = do ENC) usa nomes connection.createTopicSession( JNDI globais false, Session.AUTO_ACKNOWLEDGE); Topic topic = (Topic) ctx.lookup("topic/testTopic"); TopicPublisher publisher = session.createPublisher(topic); TextMessage msg = session.createTextMessage(); msg.setText("This is a test message."); publisher.publish(msg); } } 9
  • 10. Execução dos exemplos Diretório cap10/exemplos/mejb2/ Para montar e instalar a aplicação, use > ant jboss.deploy Uma vez instalada, rode o cliente: > ant run.jboss.client A execução não deve causar nenhuma reação no cliente, já que foi assíncrona "one-way". No servidor, aparece a mensagem enviada: [STDERR] Received new message : This is a test message. Veja também o exemplo do J2EE Tutorial (usando Queue) no subdiretório cap10/exemplos/sun/ 10
  • 11. Exercício 1. Implemente um bean que receba as mensagens enviadas pelo cliente que você desenvolveu no capítulo anterior O nome JNDI da fila é queue/A O bean deve filtrar as mensagens e receber apenas aquelas cujo cabeçalho Quantidade contiver mais que 200 itens e menos que 400 2. Faça com que o Session Bean AdminLoja envie mensagens que serão recebidas por este bean Defina a referência loja/jms/operacoes como o nome da fila no ENC (java:comp/env) Mapeie o nome a fila queue/A do JBoss 11
  • 12. Fontes [1] Ed Roman. Mastering EJB 2. Chapter 8 - Introduction to Message Driven beans. [2] J2EE Tutorial. Message-driven Beans. [3] Monson-Haefel. Enterprise JavaBeans. Chapter 13 Message-driven beans. 12
  • 13. Curso J530: Enterprise JavaBeans Revisão 2.0 - Junho de 2003 © 2001-2003, Helder da Rocha (helder@acm.org) argonavis.com.br 13