Valores de Variables en Procesos BPEL

Hola,
muchos partners me han preguntando cómo desde una aplicación cliente se puede tener acceso al valor de una variable de un proceso en específico. Sea que el proceso ya haya terminado o esté en ejecución.
¿Esto para qué? Bien pues pudiera servir para monitorear algo que está sucediendo en el proceso, para tomar una decisión desde una aplicación cliente: JSP, Swing, etc.

Aquí el código necesario para realizar dicha tarea:

WhereCondition where = WhereConditionHelper.whereInstancesOpen();
WhereCondition whereProcessId = new WhereCondition( "process_id = 'SeguimientoDeProcesos'");
WhereCondition whereInstanceId = new WhereCondition("CIKEY = " + id );
where.append("AND").append(whereProcessId);
where.append("AND").append(whereInstanceId);

// Busca las intancias
IInstanceHandle[] instanceHandles = locator.listInstances( where );
//System.out.println(instanceHandles.length + "
");
String procesos[] = new String[instanceHandles.length];

for (int i = 0; i < instanceHandles.length; i++ ){
IInstanceHandle instanceHandle = instanceHandles[i];
HashMap poe = (HashMap) instanceHandle.getField("inputVariable");
Object obj = poe.get("payload");
//System.out.println(obj.getClass().toString());
XMLElement test = (XMLElement) obj;
Pozo po = new PozoImpl(test);
status = po.getIdEtapa();
}

A considerar es la siguiente línea:
WhereCondition whereInstanceId = new WhereCondition("CIKEY = " + id );

Este id es el ProcessID de tu proceso, siendo así, pudieras buscar directamente en esta instancia.
Si no lo tienes, entonces el FOR que pongo te servirá, pues buscarás en todas las instancias, sólo comenta la línea del WhereCondition.

Después en la línea:
HashMap poe = (HashMap) instanceHandle.getField("inputVariable");

Lo que hace es obtener el valor de la variable "inputVariable" de dicha instancia.

Espero les sea de utilidad.


3 Responses to Valores de Variables en Procesos BPEL

Oriol dijo...

Hola,

Estoy elaborando una comparativa de productos BPM eligiendo filenet, Intalio y Oracle BPEL PM. Mi proyecto consiste en comparar las ventajas que aporta el enfoque de cada uno de ellos (ya sea orientado a documento, workflow, o integracion).

En estos momentos estoy trabajando con Oracle y tengo un problema con el que no se si me podriais ayudar. Os lo explico con un ejemplo muy sencillo:

Quiero crear un proceso con dos tascas que podra ver el mismo usuario: la primera pide un numero y la segunda sencillamente lo muestra(una especie de echo pero mostrado por formularios). Para crear los formularios le pido que me los cree automaticamente. Una vez he hecho esto hago doble click sobre el icono de la tasca para poder mapear los parametros definidos en el descriptor. A pesar de que en la primera tasca guardo el valor introducido en una variable X, cuando en la segunda tasca le doy como parametro la misma variable, no me aparece su valor en el formulario.

He comprobado que la primera tasca guarda el valor introducido mediante el formulario en la variable global que defino. Supongo que el problema esta en que los parámetros de "solo lectura" no se pasan del modo que yo lo hago para que me aparezca automaticamente en el formulario.

Finalmente he intentado modificar el jsp que me genera automaticamente para conseguir, de forma manual, que me salga el valor de una variable del proceso BPEL. Pero no lo estoy consiguiendo.

Sabeis como puedo acceder a los valores de una variable del proceso BPEL desde un jsp?

Muchas gracias!

José Antonio dijo...

Unas sencillas líneas que resuelven tanto... Muchas gracias, me han ayudado mucho.
Una cosa más, el metodo getField no parece funcionar con variables que no son de tipo mensaje, es decir, no tienen payload (quizás la pauta sea otra, pero...)
Da el siguiente error:

ORABPEL-02071

No se puede copiar el objeto.
Fallo al intentar copiar el objeto "com.collaxa.cube.engine.types.bpel.CXElemen
Variable@1a34f90" (clase com.collaxa.cube.engine.types.bpel.CXElementVariable),

¿Alguien sabe porqué?

Rolando Carrasco - Brimful of Asha... dijo...

hola:
puedes intentar haciendo un cast a un Element, y ahí tratar de leerlo??

slds