¿Old School BPEL?

Puedo decir que tengo trabajando con Oracle BPEL PM desde hace ya seis años. Prácticamente desde la adquisición de Collaxa por parte de Oracle he estado trabajando con el producto.
En un rato de ociosidad me encontré con este artículo que escribí en Julio de 2004 . Es básicamente una traducción de los primeros tutoriales que existieron de BPEL PM. Nosotros en Oracle LAD lo ocupábamos para dar talleres muy rápidos a clientes.
Es simplemente para aquellos que les gusta recordar, y que tengan buenos recuerdos de aquel 2004, el inicio de lo que ahora es prácticamente la base de Oracle SOA Suite.

Podrán notar el uso de Eclipse, pues en ese entonces para diagramar hacías uso de un Plug-in para dicho IDE. Igualmente notarás el uso del BPELConsole. Inclusive ésta hasta 10.1.3.5 siguió siendo la forma de monitorear tus procesos. Ahora en FMW 11.1.1.3 se tiene FMW Control.
====================================================

Práctica

Durante la práctica primero se publicará un Web Service llamado “credit rating”, es un servicio que recibe un número de nueve dígitos y regresa una cantidad que representa el crédito que se le pudiera dar a una persona en base al número de 9 dígitos ingresado, éste último representa la clave del seguro social, por ejemplo.
Una vez publicado el servicio, se utilizará BPEL designer para orquestar el servicio, ejecutarlo y publicarlo como aplicación.
El objetivo del ejercicio es ver la capacidad de BPEL para modelar flujos de procesos de negocios, y la forma en que éstos llaman y consumen servicios.
Inicia Oracle BPEL Process Manager desde Windows Start menu haciendo click en
Start > Programs > Oracle > BPEL Process Manager 2.0 > Start BPEL Process
Manager.
Antes de empezar con la práctica, es necesario compilar y publicar el servicio de “credit rating” que después se invocará como parte de la práctica, haciéndola disponible en tu servidor de BPEL local. Se usará la línea de comando en vez del BPEL Designer para compilar y publicar el servicio.
Para compilar y publicar el servicio:
  • Abre un command prompt y cámbiate a c:\orabpel\samples\utils\CreditRatingService,
Ø cd C:\orabpel\samples\utils\CreditRatingService
  • Ejecuta el comando obant .
Ø obant
  • Para probarlo :
Entra a
  • En la columna Name (abajo de la pestaña Dashboard ), haz click en el link para el proceso BPEL CreditRatingService.
clip_image002
En la forma de pruebas que aparece, introduce un número de nueve dígitos (por ejemplo, 123456789) y haz click en Post XML Message.
clip_image004
Esto te devolverá un número entero (o una excepción si el número empezaba con 0). Cualquier de las dos opcione, quiere decir que el servicio quedó bien instalado.
Crea un nuevo proyecto de BPEL
Usarás el BPEL Designer’s New Project wizard, que automáticamente genera un esqueleto de un proyecto de BPEL: el código fuente BPEL, una interface WSDL, un descriptor para publicar BPEL, y un descriptor de ANT para compilar y publicar el proceso BPEL.
Para crear un nuevo proyecto:
En el Designer, haz click en File > New > Project.
Seleciona Oracle BPEL Project.
Click en Next.
clip_image006
En el nombre del proceso BPEL escribe CreditFlow.
[Opcionalmente] en Namespace Escribe http://tutorial.oracle.com.
Deja el template como Async BPEL Process y el Use default location como su valor por default, click en Finish.
clip_image008
El nuevo proyecto será creado en C:\eclipse\workspace. Puedes ver (en el navegador del BPEL Designer) que el wizard de New Project ha creado un esqueleto para un proceso BPEL asíncrono nuevo, con todos los archivos fuente necesarios. Los nombres de los archivos son los mismos para crear procesos síncronos y asíncronos, pero el contenido de los archivos .bpel y .wsdl son diferentes según el caso.
clip_image010
Revisa la interface WSDL de tu proceso BPEL asíncrono
Ahora se revisará (y en la siguiente sección, editará) el WSDL del proceso.
Para revisar el WSDL:
En el navegador, haz doble click en el archivo CreditFlow.wsdl para editarlo.
La parte mas interesante son las que se señalan a continuación.
Nota que el wizard ha definido tanto un elemento CreditFlowRequest
complexType que el flujo acepta como entrada (en un documento estilo WSDL ) y un elemento CreditFlowResponse es regresado
Debido a que este proceso es asíncrono, dos tipos son definidos, cada uno con una operación de una sola vía: una que inicializa el proceso asíncrono y otro para el proceso que da la respuesta al cliente de manera asíncrona
<!-- portType implemented by the CreditFlow BPEL process -->
<portType name="CreditFlow">
<operation name="initiate">
<input message ="tns:CreditFlowRequestMessage"/>
</operation>
</portType>
<!-- portType implemented by the requester of CreditFlow BPEL process
for asynchronous callback purposes -->
<portType name="CreditFlowCallback">
<operation name="onResult">
<input message ="tns:CreditFlowResponseMessage"/>
</operation>
</portType>
También nota que un partnerLinkType es definido para este proceso asíncrono, y tiene dos roles, uno para el service provider y otro para el requester.
<plnk:partnerLinkType name="CreditFlow">
<!—- Este es el del provider -->
<plnk:role name="CreditFlowProvider">
<plnk:portType name="tns:CreditFlow"/>
</plnk:role>
<!—- Este es el del requester -->
<plnk:role name="CreditFlowRequester">
<plnk:portType name="tns:CreditFlowCallback"/>
</plnk:role>
</plnk:partnerLinkType>
.
Edita el WSDL de tu proceso BPEL.
Ahora editarás el archivo WSDL para modificar la entrada y la salida de los mensajes.
Para modificar la entrada y la salida de los mensajes de tu proceso BPEL:
Mientras edites el CreditFlow.wsdl, cambia los dos tipos de definiciones para que tu flujo tome un campo “ssn” como entrada (dejando el tipo de dato string) y regresa un elemento creditRating como saluda de tipo “int”. Las partes que debes de cambiar son mostradas en negrillas a continuación.
<element name="CreditFlowRequest">
<complexType>
<sequence>
<element name="ssn" type="string"/>
</sequence>
</complexType>
</element>
<element name="CreditFlowResponse">
<complexType>
<sequence>
<element name="creditRating" type="int"/>
</sequence>
</complexType>
</element>
Salva tu WSDL y cierra la ventana.
Cambia entre Overview, Process Map y Source Code
Ahora se analizará el archivo BPEL en diferentes formas.
Para ver un overview del proceso BPEL:
Haz doble click sobre CreditFlow.bpel en el navegador. La vista inicial que verás para editar el flujo BPEL, será una representación gráfica. En la izquierda puedes ver la interface del cliente, desplegando las operaciones expuestas por el processo (initiate en este caso) y cualquier operación asíncrona (onResult). Nota que el BPEL Designer automáticamente pone un partnerLink llamado client en la izquierda de la ventana. Cualquier otro partner click será desplegado en la derecha.
clip_image012
Debido a que se cambió la interface WSDL del flujo, se necesita refrescar la interface del cliente del proceso BPEL. Para hacer ésto, se debe hacer click sobre la liga “refresh” de la interface cliente del proceso.
Revisar el código fuente del proceso BPEL
El wizard “The New Project” ha creado un esqueleto básico para de un proceso BPEL asíncrono.


Para ver el código fuente

Con el archivo CreditFlow.bpel abierto y activo, haz click en el tab de BPEL Source abajo de la ventana CreditFlow.
clip_image014
Haz un Scroll down como sea necesario para revisar el código. Las partes interesantes se muestran a continuación.
El partherLink creado para la interface incluye dos roles, myRole y partnerRole. Como pudes ver en el archivo WSDL para este proceso, un proceso BPEL asíncrono típicamente tiene dos roles para la interface del cliente: uno para el flujo mismo, que expone una operación input, y otro para el cliente, que será mandado llamar de regreso de manera asíncrono.
<partnerLinks>
<!-- comments... -->
<partnerLink name="client"
partnerLinkType="tns:CreditFlow"
myRole="CreditFlowProvider"
partnerRole="CreditFlowRequester"
/>
</partnerLinks>
También, la actividad <receive> en el cuerpo principal del proceso está seguido de una actividad <invoke> para realizar una respuesta asíncrona al “requester”. (Nota la diferencia entre éste y el proceso síncrono, que utilizaría una actividad <reply> para contestar de manera síncrona.)
<sequence name="main">
<!-- Receive input from requester.
...
-->
<receive name="receiveInput" partnerLink="client"
portType="tns:CreditFlow"
operation="initiate" variable="input"
createInstance="yes"
/>
<!-- Asynchronous callback to the requester.
...
-->
<invoke name="callbackClient"
partnerLink="client"
portType="tns:CreditFlowCallback"
operation="onResult"
inputVariable="output"
/>
</sequence>
Para ver el PROCESS MAP
Ahora irás a la vista del Process Map, en donde editarás tu proceso BPEL
Haz Click en la pestaña BPEL Designer abajo de la ventana. Esto te regresará a la vista de Overview del proceso. Aquí podrás ver en la interface del cliente, que la operación de entrada generada por el wizard de “New Process” es llamada “initiate” y hay una llamada de regreso asíncrona llamada “onResult”.
Haz Click en el botón Process Map hasta arribade la ventana(o la liga de Edit Process Map
en medio de la ventana).
clip_image016
Agrega actividades al Process Map
Estás listo para editar el proceso. Empezarás agregando dos nuevas actividades: un actividad
<scope> y una <invoke> .
Para insertar una actividad <scope>:
Un scope en BPEL es un conjunto de actividades que pueden tener sus propias variables locales, manejo de excepciones, compensación, etc. – muy parecido a los bloques { } en programación.
En la paleta BPEL de la derecha, haz click en la liga More Activities para ver actividades BPELadicionales.
clip_image018
Arrastra la actividad <scope> (desde scope en la paleta BPEL) hacia la flecha de transición entre la actividad initiate (client) <receive> y el elemento de regreso onResult (client)
<invoke>.
clip_image020
En el inspector de BPEL, introduce el valor getCreditRating para el nombre del atributo scope recientemente creado.
clip_image022
Para insertar una actividad <invoke> en el scope:
Haz click en el ícono “+” al lado izquierdo de la actividad <scope> en el flujo del proceso, para expandir el scope y así agregar actividades en él.
clip_image024
Arrastra una actividad <invoke>de la paleta BPEL en el área que dice Drop activity here en el scope.
El siguiente paso es configurar la actividad <invoke> para llamar al servicio (en este caso el servicio de credit rating).
Crea un Partnerlink para el CREDIT RATING SERVICE
En el BPEL Designer, puedes agregar partnerlinks a tu proceso BPEL ya sea en la vista Overview o al momento que configuras una actividad <invoke> (utilizando un wizard). Aquí usaremos la segunda opción para agregar un partnerLink al servicio de credit rating que construiste y publicaste al inicio de la prática
En el inspector de BPEL, selecciona Create PartnerLink en el drop-down list para el atributo partnerLink.
clip_image026
Esto abrirá el Wizard “New partnerLink”.
clip_image028
Introduce de nombre creditRatingService para el partnerLink.
Introduce la ubicación del WSDL:
Click en el botón “...” a la derecha del campo de ubicación del WSDL.
El wizard presenta un navegador UDDI que muestra los servicios publicados en el servidor local de BPEL (puede tomar un poco de tiempo la primera vez que se intente hacer ésto).
En el navegador UDDI, haz click en CreditRatingService.
clip_image030
El navegador se cerrará y la URL del servicio aparecerá en el campo de ubicación del WSDL. El wizard tomará el contenido de documento WSDL para llenar los siguientes drop-down list de manera apropiada
También es posible anotar directamente la URL del WSDL directamante, si así se desea.
En la lista de partnerlLinkType, escoge “services:CreditRatingService” (el único que está definido en el documento WSDL.
En la lista de partnerRole, selecciona CreditRatingServiceProvider. Vas a dejar el campo de myRole en blanco (ya que ésto es un servicio asíncrono sin ninguna respuesta, el cliente no necesita de algún role)
Haz Click en Done.
clip_image032
Un nuevo partnerLink será agregado al flujo, y la actividad <invoke> que creaste tendrá el atributo de partnerLink automáticamente llenado.
Configuración de la actividad <INVOKE>
Ahora especificarás la operación que quieres invocar para el servicio. Aquí la única operación definida por el servicio es llamada “process”.
En el Inspector de BPEL, selecciona la operación de la lista.
clip_image034
Después de este paso, usarás las flechas drop-down a la derecha de los campos inputVariable y outputVariable. Estos comandos en estas listas drop-down abrirán wizards para crear nuevas variables, ya que el BPEL Designer sabe por medio del documento WSD L que la operación del proceso tiene tanto variables de entrada como de salida (y de qué tipos de datos son).
En la lista de inputVariable, selecciona Create Global Variable.
clip_image036
Esto abrirá el wizard de New variable, con el campo de messageType ya llenado con la información apropiada. En el siguiente paso, introducirás el nombre de la variable. Los dos campos restantes te permitirán especificar los elementos del esquema XML.
Introduce el nombre de la variable (pon crInput) y da click en Done.
clip_image038
Nota que sólo debes llenar uno de tres campos: messageType, element, or type.
Inicializar la variable de entrada
Ahora utilizarás el XPATH y la actividad <assign> para realizar manipulaciones simples de datos para inicializar la variable de entrada que estás pasando al servicio de credit rating.
Arrastra una actividad <assign> de la paleta de BPEL hacia el flujo antes de la llamada del servicio (pero en el scope de getCreditRating).
clip_image040
Como pasó anteriormente, la actividad <assing> creada ahora está seleccionada, y puedes usar el BPEL inspector para configurar los atributos.
En el Inspector, haz click en la flecha del drop-down a la derecha/arriba de la sección <assign> y haz click en Add Copy Rule.
clip_image042
Ahora usarás la pantalla de Copy Rule para copiar el campo “ssn” del mensaje del flujo de entrada a el campo “ssn” del servicio credit rating.
Llena la sección From de la forma Copy Rule de las siguiente manera:
En la lista Variable, escoge input (que es la variable pasada como entrada para empezar el proceso BPEL).
Una vez que ya escogiste la variable, la lista Part es llenada con los valores apropiados, basado en lo que leyó el BPEL Designer del esquema XML para este tipo de variable.
En la lista Part , escoge payload.
Haz click en el campo XPATH Query, en la vista de árbol desplegada por el XPATH editor, escoge “ssn”. Esto introduce el query:
/tns:CreditFlowRequest/tns:ssn en el campo.
clip_image044
Si quieres entender de dónde salió el Xpath query que acabamos de ver, realiza los siguientes pasos para ver las partes relacionadas al código fuente (o bien, revisa el siguiente pedazo de código, aquí abajo).
Haz click en Done para cerrar la forma de Copy Rule que esta llena a la mitad.
Haz Click en la penstaña BPEL Source para ver el código fuente de CreditFlow.bpel y revisa que la variable de entrada es de tipo CreditFlowRequestMessage.
<!-- Reference to the message passed as input during initiation -->
<variable name="input" messageType="tns:CreditFlowRequestMessage"/>
En el Navegador, arrastra CreditFlow.wsdl en el editor y revisa que el mensaje CreditFlowRequestMessage está definido como se muestra a continuación:
<message name="CreditFlowRequestMessage">
<part name="payload" element="tns:CreditFlowRequest"/>
</message>
De aquí puedes ver que la parte llamada payload regresará un elemento XML de tipo CreditFlowRequest, en dónde CreditFlowRequest está definido en el WSDL como:
<element name="CreditFlowRequest">
<complexType>
<sequence>
<element name="ssn" type="string"/>
</sequence>
</complexType>
</element>
De las definiciones previas, puedes ver que el Xpath query para obtener de la parte llamada payload para el campo ssn es /tns:CreditFlowRequest/tns:ssn.
Regresa a la ventana de CreditFlow.bpel, haz click en la pestaña BPEL Designer, y vuelve a abrir la forma Copy Rule haciendo click en copy abajo del Inespector en Copy Rules.
Llena la sección To de la forma Copy Rule de la siguiente manera:
En la lista Variable, selecciona crInput.
En la lista Part , selecciona payload.
En el editor XPATH, selecciona “ssn” ( que introducirá el query /services:ssn en el campo XPATH ).
Haz click en Done.
clip_image046
Compila, Publica y prueba el proceso BPEL
A pesar que no se ha hecho la parte que controle el valor de retorno del servicio, se puede probar el flujo. En esta sección de la práctica se compilará, publicará y probará el proceso BPEL.
Para compilar y publicar tu proceso BPEL:
Guarda el proceso. Haciendo click en el botón que se muestra en la siguiente imagen.
clip_image048
Haz click en el botón de Build BPEL Project, como se muestra a continuación, para compilar y publicar el proceso en tu servidor de dominio local.
clip_image050
Como últimp paso, probarás el proceso BPEL utilizando la interface de prueba creada automáticamente en la consola BPEL.
Para iniciar una instancia de prueba en el proceso BPEL:
Pon la consola BPEL en forma de “view”.
Nota que puedes usar la liga “Open BPEL Console” en el Designer como shortcut para abrir la consola.
clip_image052
Haz click en CreditFlow en el Dashboard y en la inferface HTML que aparece, introduce un número de 9 dígitos que no empiece con 0 y haz click en Post XML Message para iniciar el proceso.
clip_image054
Para ver gráficamente el estado de la instancia:
Haz click en la liga Visual Flow para ver la representación visual del estado del proceso.
clip_image056
Verás algo muy similar al process map desplegado en el BPEL Designer. Esto quiere decir que has invocado exitósamente el servicio credit rating.
Haz click en la actividad creditRatingService <invoke> en el audit trail (unas cajas abajo) para ver el mensaje enviado y el recibido del servicio credit rating.
clip_image058
Para completar la implementación del flujo, agregarás otra actividad <assign> al flujo (después de que el servicio credit rating haya sido invocado), que copiará el resultado regresado del servicio credit rating (en la variable crOutput) en el campo creditRating del resultado del proceso mismo (la variable output). Esto es un ejercicio para ti.
Esto lo puedes hacer siguiendo los pasos de la sección “Inicializando la variable de entrada”, sólo que ahora estarás trabajando sobre las variables “output” y “crOutput”.