Inicie un Proceso de Negocio en IBM BPM v7.5 usando JMS

Ejemplo de implementación de un proceso de negocio iniciado a través de un evento externo implementado mediante una cola de mensajes JMS.

Pedro E. Arroyo, WebSphere Client Technical Professional, IBM

Pedro Arroyo Pedro E. Arroyo es Ingeniero en Sistemas Computacionales por el Instituto Tecnológico y de Estudios Superiores de Monterrey Campus Ciudad de México. Cuenta con amplia experiencia desarrollando aplicaciones empresariales en la plataforma Java. Actualmente se desempeña como Client Technical Professional enfocado en la familia de productos de BPM.



23-11-2011

Las aplicaciones de procesos necesitan en muchas ocasiones trabajar de manera asíncrona y/o en paralelo a otros procesos dentro de la organización. Por ejemplo, tal vez desee que el proceso de alta de empleado inicie cuando se cree un nuevo registro de empleado en su sistema de recursos humanos de SAP. Cuando el registro es creado, el sistema SAP envía un evento a IBM Business Process Manager (IBM BPM). Éste captura el evento e inicia los pasos a seguir, como asignarle un espacio de trabajo, un equipo de cómputo, solicitar la creación de un gafete de identificación, etc.

El siguiente ejemplo describe cómo modelar un proceso de este tipo usando el nodo Start Message Event dentro de una Definición de Proceso de Negocio (Business Process Definition, BPD).

En IBM Process Designer (IPD) creamos el siguiente modelo de proceso:

Figura 1. BPD con nodo de entrada de mensaje JMS

También creamos un Objeto de Negocio que representa los datos que contendrá el mensaje de entrada.

idOperación Integer
Resultado Integer
Excepcion Integer

Figura 2. Estructura de mensaje de entrada.

Finalmente creamos un Under Cover Agent (UCA). Este componente es quien estará "escuchando" la cola de JMS, consumirá el mensaje y pasará los parámetros del mensaje de entrada al objeto de negocio MSG_A que creamos anteriormente.

Figura 3. Under Cover Agent

Como parte de los elementos necesarios para configurar el UCA hay que definir un servicio adjunto (Attached Service). Este servicio es el que será invocado una vez que el UCA detecte la llegada de un mensaje y lo consuma. En este caso el servicio es como sigue y debe tener una variable de entrada y una de salida del tipo MSG_A.

Figura 4. Servicio Adjunto al Under Cover Agent

Ahora configuraremos el nodo Start Message Event, al cual nombramos "JMS". Esto lo hacemos seleccionando dicho nodo y en la vista de Properties -> Implementation

Figura 5. Configuración de Start Event Message

En esta vista es en donde elegimos el UCA_A que creamos anteriormente. También es importante marcar la casilla de Consume Message, de lo contrario el proceso se iniciará indefinidamente pues cada vez que un mensaje es recibido se inicia una nueva instancia del BPD.

Figura 6. Mapeo de variables.

Y en la sección UCA Output Mapping, mapeamos la variable del servicio adjunto con una variable a nivel del BPD para poder hacer uso de los datos que llegaron en el mensaje de JMS.

Es momento de ejecutar el BPD. Esto lo haremos usando una clase java que coloca un mensaje en la cola de JMS de IBM BPM. En la consola de administración podemos hallar el nombre de la cola: jms/eventqueue

Figura 7. Cola de mensajería JMS para BPM

El código de la clase java es el siguiente:

private InitialContext getJndiContext() {
  if (jndiContext == null) {
	try {
		Hashtable<String, String> env = new Hashtable<String, String>();
		env.put(Context.INITIAL_CONTEXT_FACTORY,
			"com.ibm.websphere.naming.WsnInitialContextFactory");
		env.put(Context.PROVIDER_URL, "corbaloc:iiop:localhost:2809");
			jndiContext = new InitialContext(env);
	} catch (NamingException e) {
	 System.out.println("Could not create JNDI API context: " + e.toString());
	 System.exit(1);
	}
  }
 return jndiContext;
}

public void sendToQueue(String destination, String text) throws Exception {

	QueueConnectionFactory factory = (QueueConnectionFactory) getJndiContext()
		.lookup("javax.jms.QueueConnectionFactory");
	QueueConnection connection = null;
	connection = factory.createQueueConnection();
	QueueSession session = connection.createQueueSession(false,
		Session.AUTO_ACKNOWLEDGE);
	Queue queue = (Queue) getJndiContext().lookup(destination);
		
	MessageProducer producer = session.createProducer(queue);
	connection.start();

	TextMessage textMsg = session.createTextMessage();
	textMsg.setText(text);
	producer.send(textMsg);
	producer.close();
	session.close();
	connection.close();
}

public static void main(String[] args) {
	JMSTest test = new JMSTest();
	try {
		test.sendToQueue("jms/eventqueue", test.textA);
	} catch (Exception e) {
		e.printStackTrace();
	}

}

Para que el mensaje sea entendido por el UCA es necesario que tenga la siguiente forma:

<eventmsg>
 <event processApp=\"[acronimo de BPD]"\>[nombre del Event Message en UCA]<\event>
 <parameters>
  <parameter>
   <key>inputMSG<\key>
   <value>
    <idOperacion>7<\idOperacion>
    <Resultado>5<\Resultado>
    <Excepcion>6<\Excepcion>
   <\value>
  <\parameter>
 <\paramaters>
<\eventmsg>

Al ejecutar la clase java y colocar el mensaje en la cola de JMS en el log encontramos las siguientes entradas:

Figura 8. Log indicando la ejecución del UCA

Y al verificar en la vista de Inspector en IPD vemos que se inició la instancia del BPD, ejecutó un tarea de sistema y se detiene en una tarea humana que muestra el contenido del mensaje de entrada.

Figura 9. Vista de Inspector

Figura 10. Coach con los valores del mensaje JMS

Conclusión

El poder iniciar procesos de negocio a partir de un evento permite diseñar soluciones empresariales que están listas para actuar en respuesta a sucesos externos. También permite diseñar arquitecturas levemente acopladas y realizar la promesa de SOA. Con IBM Business Process Manager v7.5 puede modelar aplicaciones de procesos que respondan a mensajes JMS de manera ágil a través de la configuración de componentes.


Referencias

Modeling message events
IBM Business Process Manager, Version 7.5 InfoCenter
http://publib.boulder.ibm.com/infocenter/dmndhelp/v7r5mx/topic/com.ibm.wbpm.wle.editor.doc/modeling/topic/modeling_message_events.html

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=WebSphere
ArticleID=776735
ArticleTitle=Inicie un Proceso de Negocio en IBM BPM v7.5 usando JMS
publish-date=11232011