Muchas personas me preguntan como crear una aplicación en java que se conecte al worklist application del sistema del workflow de Oracle SOA Suite. Cuando sigues la documentación y el API, no muchos pueden encontrar la solución a ciertos errores que regresa sobre todo en la conexión al JAZN que tiene por default u otro ambiente de LDAP. Y los que llegan a pasar de aquí se encuentran con la problemática de obtener los datos de la tarea (desplegarlos).
Así que para que no tengan que hacerlo, aquí esta como crear un Java custom worklist application para el workflow de Oracle SOA suite.
Iniciamos el Jdeveloper (mi versión es: 10.1.3.3.0.4157)
-----------------------------------------------------------------------------
BPEL CON WORKFLOW
Antes que otra cosa es necesario tener un código de BPEL que utilice un User Task. En el tutorial de BPEL hay un ejemplo de como crear user tasks (workflows). Lo encuentran aquí: http://download.oracle.com/docs/cd/B31017_01/integrate.1013/b28987/phase10.htm#sthref728
Lo que yo hice para pruebas fue generar un proyecto de BPEL, asíncrono, y todo lo dejé por default. Agregué una actividad user task, como usuario puse a jcooper, y lo que le envío como datos al workflow es el elemento request del flujo de BPEL. Este XSD de request de BPEL, lo utilizaremos después para generar las clases que permiten visualizar los campos de la tarea. Que en este caso, solo es un campo (el que viene por default, tipo string).
Aquí la imagen de mi BPEL para pruebas.
-----------------------------------------------------------------------------
ARCHIVO wf_client_config.xml
Hay que modificar el archivo SOA_SUITE_HOME\bpel\system\services\config\wf_client_config.xml
Ya que las clases de Java que generaremos hacen referencia a este archivo para la conexión remota al worklist.
Yo modifiqué los métodos de conexión así:
<ejb> <serverURL>opmn:ormi://HOSTNAME:6003:oc4j_soa/hw_services</serverURL>
<user>oc4jadmin</user>
<password>PASSWORD</password>
<initialContextFactory>oracle.j2ee.rmi.RMIInitialContextFactory</initialContextFactory>
</ejb>
<identityService>
<soapEndPoint>http://HOSTNAME:80/integration/services/IdentityService/identity</soapEndPoint>
</identityService>
En la primera parte el número 6003 es el puerto de OPMN request. oc4j_soa es la máquina virtual en donde se ejecuta BPEL. Y hostname el nombre de mi máquina
En el soapEndPoint el puerto 80, es el puerto por donde escucha el HTTP_Server. Y hostname el nombre de mi máquina
-----------------------------------------------------------------------------
PROYECTO
Ya que tenemos lo anterior generamos un nuevo proyecto:
1. En el TAB de Application>Botón derecho> New Application
2. En Application Name dar un nombre (en mi caso WorklistApplication)
3. Definir un nombre de proyecto (BasicWorklistApplication)
De tal modo que me queda así
4. Después sobre BasicWorkListApplication dar click derecho, y seleccionar Project Properties > seleccionar en la nueva ventana Libraries
5. Dar click en Add Library. Aquí requerimos de dos librerías, una que ya existe, y la otra que debemos de crear.
6. Seleccionar de la lista JSP Runtime y agregarla.
7. Después generamos una nueva librería, para esto damos de nuevo click en Add Library, y en la ventana donde nos permite seleccionar librerías, en la parte de abajo hay un botón que dice New, dar click ahí.
8. En library name: WorklistApplication, en Location seleccionamos User, y la librerías son las siguientes que se muestran en la figura. (OJO: DEBEN DE ESTAR EN EL MISMO ORDEN)
En mi caso mi OracleHome es: D:/oracle/soasuite/.
Buscar esas librerías en su HOME y darlas de alta.
OJO: La ultima es una librería debe bajarse desde aquí:
http://download.oracle.com/otn/java/oc4j/10131/wsclient_extended.zip
OJO: En la carpeta de bpel/services/config, debe de estar el archivo wf_client_config.xml que se modificó con los datos de conexión al servidor de BPEL
9. Dar click en aceptar, y de nuevo en Aceptar para cerrar la ventana de las propiedades del proyecto.
Ahora vamos a generar unas clases que serán las que se conecten al servicio de worklist.
10. Dar click derecho sobre el proyecto BasicWorklistApplication, y seleccionar New. Dentro de la nueva ventana, seleccionar SimpleFiles, y despues Java Class.
11. En la siguiente ventana:
Name: WorkflowOracle
Package: wanzjin.workflowclient.com
Y dar click en aceptar
12. Código de la clase WorkflowOracle.java
13. Repetir los pasos, pero generar una clase llamada TasksOracle.java, dentro del mismo paquete wanzjin.workflowclient.com
14. Código de la clase TasksOracle.java
Esas clases se encargan de tomar un usuario, un password, seleccionan un método de acceso (jazn), se conectan al worklist de Oracle, y obtienen las tareas de un usuario determinado.
(OJO: para ver las tareas, faltan pasos, pues el código de java debe de conocer cuales son los campos que tiene la tarea. Recuerden que en mi caso el BPEL tiene un usertask y la tarea solo tiene un campo de tipo string)
15. Vamos a generar varios JSP que contendrán la lógica para desplegar tareas. No tienen nada gráfico OK? solo es el esqueleto.
Para generarlos, dar click derecho en el nombre del proyecto, y seleccionar JSP como se muestra:
Los JSP que debemos crear son:
Check.jsp
Login.Jsp
Logout.jsp
Modify.jsp
ShowTask.jsp
UserTasks.jsp
Dar el nombre del JSP y dar click en terminar. Generar todos los JSP que se mencionan arriba.
-----------------------------------------------------------------------------
JAXB
Faltan algunas cosas, la primera es
16. Generar las clases de Java que hacen referencia a los campos que tiene la lista de tareas. Estos campos vienen definidos en el esquema de XML (XSD) que utilizamos para crear la tarea. En mi caso, el XSD que sabe los campos de la tarea, es el elemento request de BPEL. Así que voy por el archivo XSD del request. Lo encuentro en donde esta el proyecto de BPEL, en la carpeta de bpel.
17. Abrir el developer prompt de BPEL. Esta en Inicio>Oracle [Nombre de la instancia de BPEL] > Oracle BPEL Process Manager > Developer Prompt
Ahí ejecutar el siguiente comando:
orajaxb -outputDir DIRECTORIO_SALIDA -schema UBICACION_XSD
En mi caso lo ejecuté así:
orajaxb -outputDir D:\oracle\JaxbGenerated -schema D:\oracle\jdevstudio10133\jdev\mywork\Pruebas\WorkFlowAplicationTest\bpel\WorkFlowAplicationTest.xsd
Te genera las clases de Java en la carpeta de salida.
18. Copiar la carpeta que se generó en el directorio src de nuestro proyecto de Jdeveloper.
Y ahora podemos utilizar esas clases. Dar refresh en el applications navigator de Jdeveloper y deberían verse las clases nuevas.
El mío se ve así:
-----------------------------------------------------------------------------
Finalmente las clases que están en esta página, hacen referencia a mi esquema de XSD. para que funcione en tu caso, se deben de modificar las clases y los JSP en donde se manda llamar a estas clases.
En mi caso la clase que generó JAXB y las que usa el código son: WorkFlowAplicationTestProcessRequest y WorkFlowAplicationTestProcessRequestImpl
Hay que cambiar los nombres en el código de ejemplo, de acuerdo al nombre que generó el JAXB con tu XSD.
El código a cambiar esta en:
A) TasksOracle.java (ahí esta mi definición de WorkFlowAplicationTestProcessRequest y WorkFlowAplicationTestProcessRequestImpl)
B) ShowTask.jsp (Modificar los atributos que deseas que despliegue la página, en mi caso solo era un atributo, llamado Input "el default de BPEL", por eso en este JSP, dice <%=payload.getInput()%>, simplemente modificarlo con los atributos deseados)
Me parece que solo en esos dos hace referencia.
-----------------------------------------------------------------------------
PRUEBA
Hay que hacer una prueba primero de las clases de java, y de nuestra configuración de los archivos. Para esto ejecutar el BPEL que hicimos al inicio desde la Consola (esto lo hacemos para que exista una tarea en el worklist "para jcooper").
En el worklist application dentro de SOA Suite debería verse creada la tarea.
Después ejecutar la clase WorkflowOracle.java (tiene un método main que ejecuta la conexión de jcooper y muestra sus tareas en la ventana de Log de Jdeveloper. Debería de verse algo así (eso que seleccioné es el ID de la tarea dentro del sistema):
Si funciona esto, probar los JSP ejecutando el Login.jsp
Y ya que funciona, mejorar la parte gráfica de los JSP :P
Así se ve mi java worklist app (para pruebas - nada gráfico):
Espero esto ayude :D
Saludos!
Wanzjin
2 comentarios:
Hola Mauricio,
Rolando me hablo de tu blog, excelente material. Te estoy enlazando desde OracleRadio. Ojala nos enlaces tambien.
Saludos
Juan Camilo
Pariente, excelente este material !!
Yo estoy empezando con SOA y la primera tarea que se me asigno fue ver lo de worklist y tu ejemplo ha sido el mejor que he encontrado, ojala podamos contactarnos para aprender mas de ti.
Mi correo es lega82@gmail.com
Publicar un comentario