Consultar instancias de procesos BPEL

El Oracle BPEL Console proporciona una gran herramienta para monitorear la situación de a bordo y completado el proceso.

Sin embargo, es a menudo un requisito de presentar esta información a un usuario de negocio dentro de una visión empresarial específica. Una forma de lograr esto es utilizar el BPEL Portlets Oracle.

Esto está bien cuando usted quiere dar al usuario una lista específica de instancias de proceso, por ejemplo una lista de todos los actualmente en ejecución procesos de orden de compra. Pero ¿qué pasa cuando hay que darles una lista más filtrada a sus requisitos empresariales específicos, por ejemplo:

  • ¿Cómo puedo encontrar todos los procesos de orden de compra abierta para un cliente concreto?
  • ¿Cómo puedo encontrar todos los procesos de servicio de asistencia se gestionan por un representante de servicio al cliente en concreto?
  • ¿Cómo puedo encontrar todos los procesos abiertos de gastos que están esperando la aprobación?
Además, una vez que hayas encontrado una instancia de proceso, ¿cómo puedo proporcionar al usuario acceso a los datos pertinentes que figuran en el proceso? Una vez más la consola de BPEL proporciona un mecanismo para la perforación en el proceso y mirando a la pista de auditoría para los datos. Pero muchas veces queremos que proveen estos datos en una vista de negocio resumen diseñado específicamente para las necesidades del usuario de negocios.

El Oracle BPEL PM Server ofrece una serie de API's que permiten cumplir con estos requisitos.

De hecho lo que no es a menudo dado cuenta es que la consola de BPEL se hace uso de estas API's, que le da la flexibilidad para completamente re-escritura de la consola si eso es lo que se necesita!

En realidad esto es raramente el caso, por lo general, el requisito es proporcionar a los usuarios de negocios con un simplificado considera adaptado a sus necesidades concretas. Una forma sencilla de conseguirlo es mediante el uso de estas API's, este es el tema de este artículo.

Localización de un proceso de Instancia

El Oracle BPEL PM cliente API proporciona una clase Localizador para permitir una aplicación cliente para buscar los procesos, instancias y actividades. La clase Localizador proporciona un número de constructores, que le permiten conectarse a un dominio alojado en BPEL sea a nivel local o remota del servidor J2EE.

A los efectos del proceso de localización de casos concretos que proporciona dos métodos muy útiles:

  • listInstances (wc WhereCondition)
  • listInstancesByIndex (wc WhereCondition)

Cada método devuelve un array de objetos de tipo InstanceHandle, que luego pueden ser utilizados para realizar operaciones en la instancia del proceso correspondiente.

El parámetro clave para cada uno de estos métodos es la WhereCondition, que se utiliza para construir una consulta para restringir los casos son devuelto por el método.

Nota: En caso de objetos condición puede ser concatenados entre sí para formar una consulta más amplia. Los métodos append y anteponer permiten al usuario añadir una cláusula (en formato de cadena) o incluso un objeto WhereCondition todo al principio o al final de la actual, en la condición.

El fragmento de código siguiente se muestra cómo construir un WhereCondition para devolver todas las instancias de proceso que se ejecuta para el "LoanFlowProcess", donde su estatus actual es "CheckingCredit".

String pProcessId = "LoanFlowProcess";
pStatus String = "CheckingCredit";

/ / Construye una condición en la que las búsquedas para las instancias abiertas
WhereCondition donde = WhereConditionHelper.whereInstancesOpen ();

/ / Extender la condición de que para filtrar en el proceso de identificación
WhereCondition whereProcessId = WhereCondition nueva ("process_id =?);
whereProcessId.setString (1, pProcessId);
where.append (whereProcessId);

/ / Extender la condición de filtro en los procesos con el estado 'CheckingCredit'
whereStatus WhereCondition nueva WhereCondition = ("status = '" + + pStatus ");
whereStatus.setString (1, pStatus);
where.append ("y"). append (whereStatus)

/ / Buscar instancias
IInstanceHandle [] = instanceHandles locator.listInstances (donde);

En el último paso, el real clase de localización está realizando una consulta en la deshidratación de la tienda BPEL, similar a la que se ilustra a continuación:

"Cikey seleccionar cube_instance donde" + whereCondition.getClause ();

Usamos el WhereCondition (que envuelve una declaración preparada SQL donde la condición), con el fin de restringir el conjunto de resultados devuelto por la consulta.

Vale la pena explorar en un poco más de detalle las diferentes partes de la WhereCondition.

Para el primero de utilizar la clase WhereConditionHelper para restringir la consulta a los procesos actualmente en ejecución solamente. Esta es una clase sencilla utilidad que ofrece una variedad de métodos estáticos para la creación de varios fragmentos de consulta (por ejemplo, proceso de retorno instancia cuyo estado está abierta, completa, abortados, rancio, etc) que luego se pueden anexar a otras donde las condiciones para crear la consulta necesaria .

Por nuestra condición de segundo que son, literalmente, añadiendo la condición

cube_instance.process_id = "LoanFlowProcess"

de nuestra declaración preparada. Aquí puede especificar más o menos cualquiera de las columnas de la tabla cube_instance base de datos (por ejemplo, Process_Id, Revision_Tag, Prioridad, Estado).

En realidad, en lugar de nombrar explícitamente esta columna, debemos utilizar las constantes adecuados definidos en com.oracle.bpel. client.util.SQLDefs (por ejemplo, SQLDefs.CI_process_id para nuestro ejemplo).

El resultado final es similar al segundo en el que estamos consultando sobre el estado del proceso. Pero ¿cuál es el estado del proceso? Bueno, no debe confundirse con el estado del proceso, que consultan en la primera WhereCondition.

Más bien el estado del proceso es una variable que toma nota de dónde en el proceso de una instancia de proceso en particular es. Cuando el proceso se inició primero, este valor se establece en "iniciados". Este valor se actualiza cada vez que usted entra en un nuevo ámbito de aplicación dentro de un proceso que contiene el nombre del ámbito de aplicación.

Tenga en cuenta: Cuando se han anidado ámbitos, contendrá el nombre de menor alcance más anidados de que el proceso está bajo, es decir, contiene el alcance último que se escribió. También cuando un proceso deja un ámbito de aplicación el valor de estado no se restablece, es decir, que todavía contiene el nombre del ámbito de aplicación anterior hasta que entra en un nuevo ámbito de aplicación.

Proceso de índices

listInstances El método es muy útil, pero aún así no nos permiten realizar una consulta basado en datos reales, celebrada en la instancia de proceso, como por ejemplo simplemente devuelva el proceso de flujo de préstamos para 'Dave'.

Para solucionar este problema, BPEL permite un proceso para tener un máximo de 6 índices y crear una condición en donde a través de uno o más de estos índices.

Esencialmente hay dos pasos a este: en primer lugar es necesario establecer los valores de índice en la instancia del proceso real, en segundo lugar se utiliza el índice de valores en una consulta a retirar todos los procesos por un valor índice determinado de una manera similar al anterior.

Establecer el valor del índice

La forma más sencilla de lograrlo es integrar un pedazo de Java (Java usando el Widget de tareas) al inicio del proceso de llamar a la API setIndex para establecer el valor de índice basado en un valor en el mensaje inicial, como se muestra en el ejemplo a continuación:

/ / Establecer index1 de Nombre de cliente
de customerName String = ((com.collaxa.cube.xml.dom.CubeDOMText)
getVariableData ("input", "carga útil", "/ auto: loanApplication / auto: de customerName / ()")) texto . gettext ();
setIndex (1, de customerName);

Nota: El método getVariableData se utiliza para recuperar la de customerName de la "entrada" variable, la sintaxis de los parámetros es similar a la "de" un componente dentro de asignar la construcción.

Consultar Procesos

El fragmento de código siguiente se muestra cómo construir un WhereCondition para volver todas las instancias de proceso que se ejecuta en index_1 es igual a 'Dave'.

pCustomerName String = "Dave";

/ / Construye una condición en la que busca en el índice 1
WhereCondition donde = WhereCondition nuevo (SQLDefs.CX_index_1 + "=?");
where.setString (1, pCustomerName);

/ / Buscar instancias
IInstanceHandle [] instanceHandles = locator.listInstancesByIndex (donde);

Sin embargo, hay un problema menor con el presente; debajo de las cobijas el método listInstances está realizando una consulta en la tabla de base de cube_instance, mientras que el listInstancesByIndex está realizando una consulta en la base de datos ci_indexes tabla .

La cuestión aquí es que si queremos realizar una consulta que es una combinación a través de estas dos tablas, es decir, me muestra todos los procesos LoanFlow para Dave. La API no WhereCondition (naturalmente) se une a permitir, sin embargo hay dos soluciones posibles:

La primera consiste en establecer el índice de valores para contener los datos adicionales requeridos por la consulta, por ejemplo set index_1 para contener el nombre del proceso y para celebrar index_2 el ID de cliente.

El segundo es ampliar el estado en que pasa al método listInstance para disponer de una condición de que las consultas en la tabla de base de datos ci_indexes, como se muestra a continuación:

/ / Extender el donde la condición para devolver sólo los procesos abiertos con la
nueva whereIndex WhereCondition WhereCondition = ("cikey en (cikey seleccionar ci_indexes donde index_1 =?");
whereIndex.setString (1, pCustomerName);
where.append ("y" ). append (whereIndex)

Nota: He utilizado los nombres de tablas y columnas para mayor claridad, pero en realidad usted debe utilizar las constantes definidas por SQLDefs.

El uso de un índice para establecer el estado

Anteriormente, en el artículo buscamos ay cómo podemos utilizar estado del proceso para realizar un seguimiento de dónde estamos actualmente en un proceso (recuerde estado contiene el nombre del alcance última que entró).

Sin embargo, mientras que esto es útil que haya un par de inconvenientes, uno es que si utilizamos el método listInstancesByIndex para localizar un proceso, no podemos en realidad el filtro sobre el estado del proceso. Sin embargo, la otra es que nos basamos en asegurar que los alcances se ha acertado el nombre, diseño, etc para realizar un seguimiento de dónde nos encontramos en el proceso. Sin embargo, en realidad, sólo puede tener una clave de algunos hitos que nos interesa, y estos abarcan varios ámbitos pueden o podemos tener más de un hito que figuran en el mismo ámbito.

Una alternativa es usar un índice para sostener el estado de la proceso, y sólo actualizar el estado del proceso mediante el método setIndex en los lugares adecuados en el proceso.

Obtener acceso a datos del proceso

Una vez que tenemos nuestra lista de los procesos de los casos, la fase final es tener acceso a los datos de hecho pertinentes que figuran en la instancia para mostrar al usuario de negocio .

Esto es simplemente el caso de la iteración a través de nuestra gama de ejemplo asas. Una vez que tienes la instanceHandle para un proceso, a continuación, puede utilizar este para acceder a las variables del proceso contenido en la instancia de proceso utilizando el método GetField.

No obstante, debe cuidar que todo lo variable que intenta acceder se encuentra visible en el ámbito de los activos el proceso. Me parece la forma más sencilla de hacerlo es definir una variable global (es decir, definir la variable a nivel del proceso) y puesta en él al principio del proceso basado en el contenido del mensaje inicial recibido por el proceso. Luego, durante la vigencia del proceso de actualización de la variable como sea necesario para reflejar el verdadero estado del proceso.

El siguiente fragmento de código muestra cómo podemos procesar cada instancia devuelta por la localización y acceso a la variable "LoanApplicationSummary" definido en el proceso BPEL.

/ / Buscar instancias
IInstanceHandle [] = instanceHandles locator.listInstancesByIndex (donde);

/ / Proceso de cada instancia
for (int i = 0; i instanceHandles.length <; i + +)
(
instanceHandle IInstanceHandle instanceHandles = [i];

/ / Obtener Solicitud de Préstamo Resumen variable
loanApplicationElement Elemento = (Element) instanceHandle.getField ("LoanApplicationSummary");

/ / Crear Solicitud de Préstamo Bean
loanApplication LoanApplication = LoanApplicationFactory.createFacade (loanApplicationElement);

/ / Proceso de Solicitud de Préstamo Bean como lo exige
...
)

Para acceder a la variable que utiliza GetField método en la instancia de la manija, como se muestra a continuación:

/ / Obtener Solicitud de Préstamo Resumen variable
loanApplicationElement Elemento = (Element) instanceHandle.getField ("LoanApplicationSummary");

Esto devolverá un DOM (Document Object Model), que representan el código XML contenido en la variable del proceso. Puede utilizar el API actual DOM para analizar y manipular el contenido XML, sino para cualquier estructura compleja que esto puede ser bastante complicado.

Para hacer este sencillo, Oracle BPEL Process Manager proporciona un modelo de objetos de Java ligero-como JAXB en la parte superior de XML, un modo llamada fachada XML. La fachada ofrece una-como antes de finales de frijol de Java para un documento XML / elemento. Fachada clases tienen una clase de fábrica correspondiente que analizar el documento XML / elemento para crear la fachada, como se muestra en el fragmento de código a continuación:

/ / Crear Solicitud de Préstamo Bean
LoanApplication loanApplication = LoanApplicationFactory.createFacade (loanApplicationElement);

Una vez que la fachada se ha creado, puede utilizar sus métodos getter para acceder a los datos requeridos.

Nota: Las fachadas son generados mediante la herramienta schemac enviado con Oracle BPEL Process Manager. Usted puede utilizar schemac para generar las fachadas de WSDL o XSD archivos (ver el Oracle BPEL PM guía para desarrolladores para más detalles).

Resumen

Como hemos visto Oracle BPEL PM proporciona una potente API de cliente que hace que sea relativamente fácil crear un negocio específicas "de la consola "adaptados a las necesidades del usuario.

Para más información sobre la API debería ver el Oracle BPEL Process Manager API del cliente de referencia

1 comentario:

  1. La próxima vez trata de no traducir los ejemplos escritos en lenguaje de programación.

    ResponderEliminar