Sunteți pe pagina 1din 12

CREACIN Y MANEJO DE UN

MDB
En esta oportunidad tratare de explicar un poco el manejo de un MDB (Message Driven Bean), apoyndonos en la
herramienta: Oracle Enterprise Pack for Eclipse que en si es un ECLIPSE.
Antes que nada un poco de conceptos:
ENTERPRISE JAVABEANS (EJB):
Enterprise JavaBeans son componentes de J2EE que implementan la tecnologa Enterprise JavaBeans (EJB). Estos
beans corren dentro de un EJB container, en un runtime environment dentro del Application Server. Proporcionan un
modelo de componentes que simplifica el desarrollo de aplicaciones del lado del servidor, proporcionando apoyo
automtico a los servicios como las transacciones, seguridad y conectividad de base de datos. Estos servicios son
proporcionados por el contenedor EJB que forma parte del servidor de aplicaciones. El contenedor maneja el ciclo de
vida completo del Enterprise JavaBean (EJB). EJB 2.0 especifica tres tipos de Beans: Session, Entity, Message
Bean.
MESSAGE DRIVEN BEAN (MDB):
Un MDB (Bean controlado por mensajes) es un consumidor de mensajes asncrono y es invocado por el
contenedor EJB al momento de la llegada de un mensaje JMS en una cola. Un cliente no puede acceder al Bean
directamente, sino que lo hace mediante el envo de mensajes al destino de JMS (cola o tema), este MDB se activa
mediante la implementacin de la clase MessageListener. Los mensajes de beans no tiene estado conversacional y
son annimos.
Una plantilla base de un MDB debera lucir de esta manera:
import
import
import
import
import
import
import
import

javax.ejb.ActivationConfigProperty;
javax.ejb.MessageDriven;
javax.ejb.MessageDrivenBean;
javax.ejb.MessageDrivenContext;
javax.jms.Message;
javax.jms.MessageListener;
javax.annotation.Resource;
javax.ejb.EJBException;

/**
* JavamanMDB
* @author cguerra
*/
@MessageDriven( activationConfig = { @ActivationConfigProperty(
propertyName = "destinationType",
propertyValue = "javax.jms.Queue") },
mappedName
= "jms/MQ_01",
messageListenerInterface =
MessageListener.class )
public class JavamanMDB implements MessageListener, MessageDrivenBean{
private static final long serialVersionUID = 6500707485732319445L;
@Resource
private MessageDrivenContext mdc = null;
//Constructor ...
public JavamanMDB(){
}
/**
* setMessageDrivenContext
* @param mdcParam
*/
@Override
public void setMessageDrivenContext( MessageDrivenContext mdcParam ){
this.mdc = mdcParam;
}
/**
* ejbRemove
*/
@Override
public void ejbRemove() throws EJBException {
}
/**

* onMessage
* @param messageParam
*/
public void onMessage( Message messageParam ){
}
}

El objetivo del TUTORIAL es justamente intentar crear lo mostrado en la grafica de arquitectura:


1. Un app Cliente (Puede ser un JSP, un Servlet, etc). En nuestro caso una clase Main que lance
un Mensaje.
2. La configuracin en un Servidor de aplicaciones de una COLA JMS.
3. La creacin de un EJB de tipo MDB para que esta al escucha, de los mensajes ingresados en
una COLA.
4. La interpretacin del mensaje.
5. Procesamiento y redistribucin (esta parte ser explicada solamente).

INICIANDO EL DUMMY:
1. El App Client ser un tipo lanzador de la siguiente manera:

Nos hemos apoyado en: UtilJMS.java que es un POJO utilitario que nos facilitara el envo y obtencin del
contenido de colas de tipo JMS.
Al momento de crear un proyecto JAVA simple, mapeamos los .JAR respectivos dentro del ClassPath del
App: wlclient.jar y jmscommon.jar

2. Dentro del App Cliente se necesita conectarnos al Servidor de Aplicaciones por medio de unos JNDI
para: Colas, Factory y User/Passwor creados:
-

FACTORY: jms/crgaQueueConexionFactory
COLA:
jms/crgaTestQueue

Todo eso es una configuracin que si desean hacerla desde cero se tendrn que apoyar en el tutorial:
http://frameworksjava2008.blogspot.com/2012/05/configuracion-jms-en-oracle-weblogic.html

3. Para la creacin del MDB( el objetivo de este tutorial ), nos basaremos en la IDE: Eclipse (Oracle
Enterprise Pack for Eclipse), que viene como adicional cuando se instala el Oracle Fusion
Middleware 11.
Creamos un nuevo App de tipo EJB:

Damos un nombre a la App, seleccionamos el SERVER y definimos el nombre del EAR.

Esto creara tres Apps:


-

Dummy_Javaman_MDB
Dummy_Javaman_MDBClient
Dummy_Javaman_MDB_EAR

Ahora eliminaremos el: Dummy_Javaman_MDBClient, para ello: Debemos ELIMINAR el App


fsicamente y luego:
Eliminamos de: ejb-jar.xml

Eliminamos de: MANIFEST.MF

Dentro de: Dummy_Javaman_MDB, creamos el paquete donde ser creado el MDB:

Creamos un NUEVO App de tipo MDB:

Definimos los parmetros del MDB y la cola JMS a la cual se conectara (Debe se JMS/crgaTestQueue),
dependiendo como se haya configurado el JNDI:

Agregamos las libreras:


-

javax.jms.MessageListener
javax.ejb.MessageDrivenBean

Se generara la siguiente clase MDB:

package org.java.mdb.dummy;
import
import
import
import
import
import

javax.ejb.ActivationConfigProperty;
javax.ejb.MessageDriven;
javax.ejb.MessageDrivenBean;
javax.ejb.MessageDrivenContext;
javax.jms.Message;
javax.jms.MessageListener;

/**
* JavamanBeanMDB
* @author Cesar Ricardo
*/
@MessageDriven(activationConfig = { @ActivationConfigProperty( propertyName
propertyValue = "javax.jms.Queue") },
mappedName
= "crgaTestQueue",
messageListenerInterface = MessageListener.class )
public class JavamanBeanMDB implements MessageListener, MessageDrivenBean{

= "destinationType",

private static final long serialVersionUID = 8522899073539808437L;


/**
* Default constructor.
*/
public JavamanBeanMDB(){
// TODO Auto-generated constructor stub
}
/**
* @see MessageDrivenBean#ejbRemove()
*/
public void ejbRemove(){
// TODO Auto-generated method stub
}
/**
* @see MessageDrivenBean#setMessageDrivenContext(MessageDrivenContext)
*/
public void setMessageDrivenContext( MessageDrivenContext mdbParam ){
// TODO Auto-generated method stub
}
/**
* @see MessageListener#onMessage(Message)
*/
public void onMessage( Message message ){
// TODO Auto-generated method stub
}

Agregar las libreras de JMS y Log4j dentro de una carpeta .lib del ClassPath de la aplicacin MDB en:
Dummy_Javaman_MDB:
-

jmscommon.jar
log4j-1.2.9.jar

wlclient.jar

Modificar la clase MDB para que al momento de activarse lea sepa lee el mensaje JMS captado:

package org.java.mdb.dummy;
import
import
import
import
import
import
import
import
import
import

org.apache.log4j.Logger;
javax.annotation.Resource;
javax.ejb.ActivationConfigProperty;
javax.ejb.MessageDriven;
javax.ejb.MessageDrivenBean;
javax.ejb.MessageDrivenContext;
javax.jms.JMSException;
javax.jms.Message;
javax.jms.MessageListener;
javax.jms.TextMessage;

/**
* JavamanBeanMDB
* @author Cesar Ricardo
*/

@MessageDriven( activationConfig = { @ActivationConfigProperty( propertyName


propertyValue = "javax.jms.Queue") },
mappedName
= "jms/crgaTestQueue",
messageListenerInterface = MessageListener.class )

= "destinationType",

public class JavamanBeanMDB implements MessageListener, MessageDrivenBean{


private static final long serialVersionUID = 5230066640840988428L;
private transient Logger logger = Logger.getLogger( this.getClass().getName() );
@Resource
private MessageDrivenContext mdc;
//Constructor ...
public JavamanBeanMDB(){
}
/**
* setMessageDrivenContext
* @param mdbParam
*/
public void setMessageDrivenContext( MessageDrivenContext mdbParam ){
this.mdc = mdbParam;
}
/**
* ejbRemove
*/
public void ejbRemove(){}
/**
* ejbRemove
*/
public void ejbCreate(){}
/**
* onMessage
* @param messageParam
*/
public void onMessage( Message messageParam ){
this.logger.info( "************ DENTRO DE: [onMessage] [TRAMA] ************" );
try{
if( messageParam instanceof TextMessage ){
TextMessage txtMessage = (TextMessage)messageParam;
String mensaje = txtMessage.getText();
System.out.println( "TRAMA: " + mensaje );
String[] arrayTrama = mensaje.split( "\\|" );
System.out.println( "TAMANO: " + arrayTrama.length );
String
String
String
String
String
String

codigo
nombres
apellidos
dni
edad
telefono

=
=
=
=
=
=

System.out.println(
System.out.println(
System.out.println(
System.out.println(
System.out.println(
System.out.println(
System.out.println(
System.out.println(

arrayTrama[
arrayTrama[
arrayTrama[
arrayTrama[
arrayTrama[
arrayTrama[
" " );
"CODIGO:
"NOMBRES:
"APELLIDOS:
"DNI:
"EDAD:
"TELEFONO:
" " );

0
1
2
3
4
5
"
"
"
"
"
"

];
];
];
];
];
];
+
+
+
+
+
+

codigo
nombres
apellidos
dni
edad
telefono

);
);
);
);
);
);

}
}
catch( JMSException e ){
this.logger.error( "ERROR [JMSException]: ", e );
e.printStackTrace();
this.mdc.setRollbackOnly();
}
catch( Exception e ){
this.logger.error( "ERROR [Exception]: ", e );
e.printStackTrace();
}
catch( Throwable e ){
this.logger.error( "ERROR [Throwable]: ", e );
e.printStackTrace();

}
}
}

Luego, de la SEGMENTACION e IMPRESIN de los datos el mensaje obtenido. Uno puede aqu hacer muchas
cosas, especficamente lo que el negocio requiera:
-

Transformacin de los datos.


Redireccionamiento del mensaje a otra COLA.
Envo de los datos a un WebService.
Registro de los datos en una DB.

Lo importante es que el mensaje ya ha sido capturado correctamente. En este caso el mensaje a sido de tipo
TRAMA con separado pero podra venir en N formatos: Trama (con separador), XML, Trama (Sin
separador), etc.
Ahora vamos a desplegamos, en el SERVER el MDB creador:

Accedemos al SERVIDOR DE APLICACIONES: http://localhost:7001/console, y validamos el MDB desplegado


como un EAR.

Luego de tener todo configurado y listo, ejecutamos el App Client para ejecutar la trama JMS:

Validar el LOG en CONSOLA en la App Client:

Validar los resultados en el LOG en la CONSOLA del MDB en el SERVER:

S-ar putea să vă placă și