martes, 13 de noviembre de 2012

¿Bug en JDeveloper con BPEL?


Desarrollando algunos servicios web compuestos me topé con un curioso detalle del JDeveloper al momento de generar el código del archivo xml (.bpel) de mi servicio web compuesto. El problema se produce cuando se realiza un servicio compuesto asíncrono que solamente consta de un elemento “receive”, un elemento “human task” (los componentes que genera automáticamente) y un elemento “callBack”. El generador de código del JDeveloper generá mal el nombre del elemento “human task” dentro del archivo .bpel, agregándole al final del nombre establecido un “_N”. donde N es un número. Por ejemplo si mi tarea se llama “HumanTask.taskservice”, el código generado será  “HumanTask.taskservice_1”. Por supuesto, la solución es tan sencilla, solamente hay que entrar al archivo xml y modificarlo manualmente, sin embargo, publico esté articulo para saber con la ayuda de la comunidad si a alguien más le ha pasado. ¿Es un bug de JDeveloper?

Datos del ambiente utilizado para reproducir el problema:

Windows 7 Home Premium 64 bits.
8 GB RAM, Core i5 2.53Ghz.
JDeveloper 11.1.1.5
BPEL 1.1 y BPEL 2.0 (En las dos versions se produce el mismo problema).

Para reproducir el error siga los siguientes pasos:

Abrir JDeveloper 11.1.1.5 y crear una Aplicación Nueva.


A esta aplicación agregamos un proyecto nuevo.


Elegimos un proyecto de tipo “SOA Project”.


Ingresamos un nombre al proyecto.


Elegimos la opción “Empty Composite” y luego clic en el botón “Finish”.



Se crearán todos los archivos del proyecto. (Ver cuadro azul).
Arrastramos un elemento “BPEL Process” (Cuadro rojo) hacia el área  “Components” (cuadro verde).




Ingresar un nombre al proceso, para fines de ejemplo dejé el nombre default. Elegir el “Template” “Asynchronous BPEL Process”. Luego dar clic en el botón OK.


Agregar un elemento “Human Task” (Cuadro rojo) en el área “Components” (Cuadro verde).


Ingresamos el nombre del elemento “Human Task”.  Dar clic en el botón OK.


Enlazamos el elemento “Human Task” a nuestro elemento “BPEL Process”. Luego de enlazar los elementos, dar doble clic en el elemento “Human Task”.


En la pestaña “General” únicamente ingresar el titulo de la tarea, los demás valores dejarlos con valor default.


En la pestaña “Data”, dar clic en el botón de “Agregar” (cruz verde) y seleccionar la opción “Add other parameter”.


Seleccionar la opción “Element” (Cuadro verde) y luego seleccionar el elemento “process” que está bajo la rama “BPELProcess1.xsd” (Cuadro azul). Este elemento es el valor default de ingreso hacia el proceso bpel. Luego dar clic en el botón OK de la ventana “Type Chooser”, y finalmente clic en el botón OK de la ventana “Add task Parameter”.


Dar doble clic en el area gris de “Edit Participant” (cuadro verde) y luego clic en el botón de “agregar”  y seleccionar la opción “Add User” (cuadro rojo).


Dar clic en el botón “…” (cuadro verde), luego elegir un “Application Server” (cuadro azul), seleccionar un usuario, dar clic en el botón “Select” y se verá que el usuario ha sido agregado correctamente al área “Selected user” (cuadro naranja), finalmente dar clic en el botón OK de la ventana “Identity Lookup” (cuadro negro) y luego clic en el botón OK de la ventana “Add Participant Type”.


Dar clic en el objeto “BPELProcess1.bpel” (cuadro celeste), luego arrastrar un elemento “Human Task” (cuadro rojo) y soltarlo en medio del elemento “receive” y el elemento “callBack” (Cuadro azul). Luego dar doble clic sobre el elemento Human Task que acabamos de crear.


Seleccionar en el campo “Task Definition” nuestro HumanTask creado, en este ejemplo se llama “HumanTask1”. Luego dar clic en el botón “…” (cuadro rojo).


Seleccionar el elemento “client:process” que está dentro de la variable “inputVariable”. Luego dar clic en el botón OK.


Asi se verá el servicio web compuesto final:


Finalmente le damos Desplegar a nuestro servicio web:


Hasta aquí todo lo hemos creado solamente con asistentes, ingresando los minimos valores que nos solicitaban, incluso los nombres los hemos dejado default (esto no cambia el resultado), sin embargo, cuando está en la fase de compilación falla, a continuación los errores:


Tal como indicaba al principio del artículo, el problema se produce porque al final del nombre de la tarea agrega un “_N”, donde N es un número. En este caso agregó “_1” al nombre “Humantask.TaskService”.  Si vemos el archivo .bpel de nuestro servicio compuesto veremos este código mal generado:


¿Cuál es la solución? Modificar manualmente el archivo “.bpel” y remover el adicional “_1” que aparece en los parámetros “partnerLink” del elemento “invoke” y del elemento “receive”.  (Ver en la imagen anterior las líneas de código subrayadas por una línea verde).

¿Es un bug? 



















No hay comentarios:

Publicar un comentario

Oracle ACE Director Award - Deiby Gómez

Thanks #OracleACE Program for this awesome certificate recognizing the work I have done in the community for the last year. Looking forwa...