Publicado el 22 de Enero del 2019
510 visualizaciones desde el 22 de Enero del 2019
211,8 KB
24 paginas
Creado hace 13a (23/02/2011)
Especialista Universitario Java Enterprise
Sesión 4: MessageDrivenBeans
©2010-2011 Depto. Ciencia de la Computación e IA
Especialista Universitario Java Enterprise
Puntos a tratar
• Introducción
• Reglas de Programación
• Anotaciones
• Callbacks
• Envío de Mensajes JMS desde el MDB
• Transacciones Distribuidas
• Mejores Prácticas
• Roadmap
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans - 2
Especialista Universitario Java Enterprise
MessageDrivenBean
• Es un oyente de mensajes que puede consumir de modo asíncrono
mensajes de una cola o de una durable subscription.
• Dichos mensajes pueden ser enviados por cualquier componente JavaEE
(cliente, otro EJB o una componente Web como un servlet).
Incluso desde una aplicación o sistema que no use tecnología JavaEE.
• Proporciona multi-threading al manejar los mensajes entrantes
mediante múltiples instancias de beansalojados en el pool del
servidor de aplicaciones.
• Todo MDB contiene el método onMessage()
• A diferencia de un MDB, un cliente JMS realiza las siguientes tareas:
•
• Crear un consumidor asíncrono para recibir el mensaje.
Con un MDB asociamos el destino y la factoría de conexiones durante
el despliegue vía anotación/descriptor despliegue.
• Registrar el listener de mensajes con setMessageListener
El MDB registra el listener automáticamente.
• Especificar el modo de acuse de recibo
por defecto es AUTO_ACKNOWLEDGE
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans - 3
Especialista Universitario Java Enterprise
Proceso MDB
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans - 4
Especialista Universitario Java Enterprise
Más Características…
• El MDB usa la anotación @MessageDriven
• Permite especificar las propiedades del beano de la factoría de
conexión, tales como el tipo de destino, la subscripción duradera, el
selector de mensajes, o el modo de acuse de recibo.
• El contenedor iniciaráuna transacción justo ANTES de llamar al
método onMessage() y haráun commit de esta transacción cuando
dicho método haga el return, a no ser que la transacción esté
marcada como rollback en el contexto del MDB.
• Difiere de otros EJBs, en que el MDB no tiene interfaz local o remota.
• Sólo la clase bean.
• Se parece a un StatelessSessionBean (SSB); sus instancias son short-
livedy no retienen estado para un cliente específico.
• Pero sus variables pueden contener información de estado entre los
diferentes mensajes de cliente: por ejemplo, un conexión a una base de
datos, o una referencia a un EJB, etc...
• El contenedor tiene un pool de objetos MDB que permite que los
mensajes se procesen concurrentemente
• Puede afectar al orden en que se reciben los mensajes.
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans - 5
Especialista Universitario Java Enterprise
Reglas de Programación
1.
La clase MDB debe directamente (con implements) o
indirectamente (mediante anotaciones o descriptores) implementar
un interfaz de listener de mensajes.
La clase MDB debe ser concreta, ni abstracta ni final.
La clase MDB debe ser un POJO y no una subclase de otro MDB.
La clase MDB debe declararse pública.
2.
3.
4.
5. El constructor de la clase MDB no debe tener argumentos.
Si no tiene constructor, el compilador implementaráuno por defecto.
El contenedor usa ese constructor para crear instancias de MDBs.
6. No se puede definir un método finalize.
•
•
•
Si es necesario alguno código de limpieza, se debería definir un método
anotado con PreDestroy.
7.
Los MDBsdeben implementar los métodos de la interfaz
MessageListener y esos métodos deben ser públicos, nunca
estáticos o finales.
8. Esta prohibido lanzar javax.rmi.RemoteException o cualquier
excepción de ejecución.
•
Si se lanza un RuntimeException, la instancia MDB finalizará.
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans - 6
Especialista Universitario Java Enterprise
Ejemplo de MDB
@MessageDriven(mappedName= "jms/Queue", activationConfig= {
@ActivationConfigProperty(propertyName= "destinationType",
propertyValue= "javax.jms.Queue")
})
public class ConsumidorMDBBeanimplements MessageListener
{
System.out.println("Constructordel MDB");
public ConsumidorMDBBean() {
}
public void onMessage(Messagemessage)
{
TextMessagemsg= null;
try {
if (message instanceofTextMessage) {
msg= (TextMessage) message;
System.out.println("RecibidoMDB [" + msg.getText() + "]");
System.err.println("Elmensajeno esde tipotexto");
} else {
}
System.err.println("JMSExceptionen onMessage(): " + e.toString());
System.err.println("Exceptionen onMessage():" + t.getMessage());
} catch (JMSExceptione) {
} catch (Throwablet) {
}
}
}
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans - 7
Especialista Universitario Java Enterprise
@MessageDriven
@Target(TYPE)
@Retention(RUNTIME)
public @interface MessageDriven {
String name() default "";
Class messageListenerInterfacedefault Object.class;
ActivationConfigProperty[] activationConfig() default {};
String mappedName();
String description();
}
• Todos los argumentos son opcionales.
• Ejemplo mínimo:
@MessageDriven
public class GestorPeticionesCompraMDB
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans - 8
Especialista Universitario Java Enterprise
Implementando el Listener
• El contenedor utiliza el listener para registrar el MDB en el proveedor
de mensajes y pasar los mensajes entrantes a los métodos
implementados en el listener.
• Con anotaciones:
@MessageDriven(
name="MiGestorPeticionesCompraJMS",
messageListenerInterface="javax.jms.MessageListener")
public class GestorPeticionesCompraMDB {
• Con código:
public class GestorPeticionesCompraMDBimplements MessageListener {
• Otra opción es mediante el descriptor de despliegue, y dejar los
detalles fuera del código.
• La elección entre un modo u otro suele ser cuestión de gustos.
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans - 9
Especialista Universitario Java Enterprise
activationConfigy ActivationConfigProperty
• La propiedad activationConfig permite especificar la
configuración específica mediante un array de instancia de
ActivationConfigProperty
• Definición de ActivationConfigProperty:
public @interface ActivationConfigProperty {
String propertyName();
String propertyValue();
}
• Cada propiedad de activación es un par (nombre, valor)
• Nombres de propiedades: destinationType,
connectionFactoryJndiName, destinationName,
acknowledgeMode, subscriptionDurability,
messageSelector
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans -10
Especialista Universitario Java Enterprise
Ejemplo de ActivationConfigProperty
• Ejemplo con las propiedades más utilizadas:
@MessageDriven(
name="MiGestorPeticionesCompra",
activationConfig = {
@ActivationConfigProperty(
",
@ActivationConfigProperty(
propertyName="destinationType",
propertyValue="javax.jms.Queue"),
propertyName=“
propertyValue="jms/QueueConnectionFactory"),
propertyName="destinationName",
propertyValue="jms/PeticionesCompraQueue")
@ActivationConfigProperty(
}
)
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans -11
Especialista Universitario Java Enterprise
Otras propiedades
@ActivationConfigProperty(
propertyName="acknowledgeMode",
propertyValue="DUPS_OK_ACKNOWLEDGE")
@ActivationConfigProperty(
@ActivationConfigProperty(
propertyName="destinationType",
propertyValue="javax.jms.Topic"),
propertyName="subscriptionDurability",
propertyValue="Durable")
@ActivationConfigProperty(
propertyName="messageSelector",
propertyValue="Anyo= 2008")
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans -12
Especialista Universitario Java Enterprise
Responsabilidad del Contenedor
• Crear instancias MDBsy
•
configurarlas.
Inyectar recursos, incluyendo el
contexto 'message-driven'.
• Colocar las instancias en un pool
gestionado.
• Cuando llega un mensaje, sacar un
beaninactivo del pool
• el contenedor puede que tenga que
incrementar el tamaño del pool
• Ejecutar el método de listener de
mensajes (método onMessage)
onMessage, devolver al pool el bean.
• Al finalizar la ejecución del método
• Conforme sea necesario, retirar (o
destruir) beansdel pool.
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans -13
Especialista Universitario Java Enterprise
Callbacks
• PostContruct
• Se llama inmediatamente un
vez el MDB se ha creado,
iniciado y se le han
inyectado todo los recursos
• PreDestroy
• Se llama antes de quitar y
eliminar las instancias bean
del pool.
• Estos callbacks se utilizan para reservar y liberar
recursos inyectados que se usan dentro de onMessage
Servicios de Mensajes con JMS
©2010-2011 Depto. Ciencia de la Computación e IA
MessageDrivenBeans -14
Especialista Universitario Java Enterprise
Ejemplo Callbacks(I) –MDB + JDBC
@ActivationConfigProperty(propertyName= "destinationType", propertyValue= "javax.jms.Queue")
@MessageDriven(mappedName= "jms/Queue", activationConfig= {
})
public class ConsumidorMDBJDBCBeanimplements MessageListener {
System.out.println("Constructordel MDB");
private java.sql.Connectionconnection;
private DataSourcedataSource;
@Resource
private MessageDrivenContextcontext;
public ConsumidorMDBJDBCBean() {
}
@Resource(name= "jdbc/biblioteca")
public void setDataSource(DataSourcedataSource) {
}
@PostConstruct
public void initialize() {
this.dataSource= dataSource;
try {
connection = dataSource.getConnection();
} catch (SQLExceptionsqle)
Comentarios de: Sesión 4: Message Driven Beans - Servicios de Mensajes con JMS (0)
No hay comentarios