ROI de BPM

0

En los últimos días he estado platicando con 2 clientes que tienen inquietud sobre el ROI que uno puede presentar al comité para justificar una inversión sobre tecnlogía BPM.

Me llegó este artículo a mi email que puede ser interesante para todos:

http://www.ebizq.net/hot_topics/bpm/features/9958.html?page=1

En Oracle existe una herramienta para hacer assesments sobre SOA, que igualmente es ideal para tener un sustento para justificar internamente, ésta la pueden encontrar en: http://www.oracle.com/soa


Los Tipos de Listas de Valores y Algunos Tips

1

En estos días estuve trabajando con un requerimiento de un proyecto en el cual detectamos algunas características especificas de las listas de valores en JDev11g, a partir de lo cual decidí crear esta entrada. Dado que en post anteriores ya he presentado las bases en como crear las listas de valores, en este articulo voy a explicar brevemente los distintos tipos que se tienen en JDev11g, así como también algunos tips para trabajarlas.

Vamos a presentar los distintos Departamentos de una organización como una lista de valores; internamente el atributo que nos interesa es el ID del departamento (departmentId), sin embargo para el UI la idea es presentar el nombre del mismo (departmentName).

Types

Los tipos que tenemos desde el Modelo en el cual definimos la lista son:

Choice List y Combo Box: Es la opción a elegir para obtener un af:selectOneChoice o la lista de valores tradicional. La unica diferencia es que con combo boxes se puede tener un historial de los elegidos previamente.

ComboBox with List of Values: Esta opción se renderiza como un af:inputComboboxListOfValues esta lista de valores se puede presentar directamente como un look and feel más AJAX, o también tiene la funcionalidad automática de presentar un componente de busqueda. comboInput

Muy util para cuando se requiere hacer un query sobre otra tabla para obtner este valor. Una característica de esta lista es que si en un backing bean hacemos ejecutamos getValue(), esta lista nos va a devolver por defecto el número correspondiente a la posición, más no el ID. Si queremos obtener el valor, en el binding de la lista ajustamos la propiedad includeSelectionAttr

binding

Input Text with List of Values: Parecido al anterior pero en este caso el UI se presenta como una lupa de busqueda, renderiza como un af:inputListOfValues, la cual puede activar una busqueda o puede hacer un query directo a la fuente de datos, si se quiere hacer la busqueda sobre otra tabla, es ideal.

inputTextWListList Box: Presenta la lista dentro de una caja de opciones, ideal cuando se quiere seleccionar más de un valor. Se renderiza como un af:selectOneListBox.

listBox

 

Estas presentaciones de listas pueden también ser intercambiadas en la interfaz gráfica así como también los tipos de bindigs, de las mismas.  Para cambiar una lista desde la interfaz, solo basta con ir a la estructura, seleccionar la lista de valores, click derecho y hacer click en Convert. Esto también se puede hacer directamente sobre el diseñador gráfico.

Otro de los elementos que se puede configurar desde la definición a través del VO es la opción de búsqueda. Esta opción permite crear un pop-up para realizar una búsqueda la fuente de datos de la lista (lo cual puede ser otro VO y en este caso lo que se hace es ejecutar el query con base en ciertos parámetros.

El o los valores que se retornan, una vez se escoge un elemento de la lista es también configurable, lo cual es una opción es muy útil si requerimos asignar más de un valor sobre atributos del VO base.

returnValues 

El binding de las listas de valores puede ser de 2 tipos List binding o ListOfValue binding. El segundo nos da una serie de opciones avanzadas para configurar el comportamiento de la lista, normalmente de acuerdo como se defina la lista desde el VO este binding se hace de manera automática, sin embargo a través del PageDef podríamos cambiar entre uno y otro.


Refresh de Pooling de Conexiones Remoto a través de MBeans.

6

Este es una aportación de Andrés Ramírez de Perú. El tuvo un issue de refresh de Pooling de Conexiones hacia BD, sobre todo al modificar el cuerpo de un paquete almacenado. El decidió realizarlo a través de Mbeans controlando el pool de conexiones. Aquí la descripción de cómo lo hizo (gracias Andrés):

1. UTILIZACION de Mbeans

1.1. Mediante la consola de administración: Oracle Enterprise Manager

a. Ingresar a la instancia deseada (oc4j_soa)

clip_image003

b. Ir a la pestaña de administración

clip_image006

c. Ir a la sección de “Búsqueda de MBeans"

clip_image009

d. Buscar el recurso deseado (OrdenesCP – Connection Pool)

clip_image012

e. Ir a la pestaña de Operaciones e ingresar al método (refreshConnectionPool)

clip_image016

f. Invocar Método

clip_image019


1.2. Aplicaciones Custom: Java JMX en JDeveloper

a. Ingresar al Jdeveloper y crear la siguiente estructura:

clip_image021

b. En las propiedades del Proyecto (MBeansTest) agregar las siguientes librerias:

clip_image023

Ubicaciones de los Jars:

C:\Jdeveloper\j2ee\home\lib\jmx_remote_api.jar

C:\Jdeveloper\j2ee\home\lib\jmxcluster.jar

C:\Jdeveloper\j2ee\home\lib\jmxri.jar

C:\Jdeveloper\j2ee\home\oc4jclient.jar

C:\Jdeveloper\opmn\lib\ons.jar

C:\Jdeveloper\opmn\lib\optic.jar

C:\Jdeveloper\j2ee\home\lib\adminclient.jar

Nota: Agregar la Libreria J2EE desde la opción: Add Library...

c. Definir la clase MBeansClient.java (Ver Anexo 1)

ANEXO 1

package mbeanstest;

import java.io.IOException;

import java.net.MalformedURLException;

import java.util.Hashtable;

import java.util.Iterator;

import java.util.Set;

import javax.management.AttributeNotFoundException;

import javax.management.InstanceNotFoundException;

import javax.management.InvalidAttributeValueException;

import javax.management.MBeanException;

import javax.management.MBeanServerConnection;

import javax.management.MalformedObjectNameException;

import javax.management.ObjectName;

import javax.management.ReflectionException;

import javax.management.remote.JMXConnector;

import javax.management.remote.JMXConnectorFactory;

import javax.management.remote.JMXServiceURL;

import oracle.oc4j.admin.jmx.remote.api.JMXConnectorConstant;

public class MBeansClient {

//URL del OC4J Single

private static final String OC4J_SOA_URL =

"service:jmx:rmi:///opmn://172.20.1.92:6005/oc4j_soa";

//URL del OC4J Cluster

private static final String CLUSTER_OC4J_SOA_URL =

"service:jmx:rmi:///opmn://172.20.1.92:6005/cluster";

//Nombre del recurso MBean

private static final String MBEAN_OBJECT_NAME =

"oc4j:j2eeType=JDBCResource,name=\"OrdenesCP\",J2EEApplication=default,J2EEServer=standalone";

//Nombre del grupo (cluster) MBean

private static final String CLUSTER_MBEAN_OBJECT_NAME =

"ias:j2eeType=J2EEServer,name=oc4j_soa,J2EEServerGroup=default_group,ASInstance=soa.test.com";

//Nombre del método del MBean

private static final String MBEAN_METHOD_NAME =

"refreshConnectionPool";

//Credenciales del Administrador

private static final String USERNAME = "oc4jadmin";

private static final String PASSWORD = "oracle10g";

public MBeansClient() {

}

//Crear conexion con el Servidor MBeans

public MBeanServerConnection getMBeanConnection(String URL) throws MalformedURLException,

IOException {

JMXConnector jmxConnector = null;

JMXServiceURL serviceUrl = new JMXServiceURL(URL);

Hashtable env = new Hashtable();

env.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "oracle.oc4j.admin.jmx.remote");

Hashtable credentials = new Hashtable();

credentials.put(JMXConnectorConstant.CREDENTIALS_LOGIN_KEY, USERNAME);

credentials.put(JMXConnectorConstant.CREDENTIALS_PASSWORD_KEY, PASSWORD);

env.put(JMXConnector.CREDENTIALS, credentials);

jmxConnector = JMXConnectorFactory.newJMXConnector(serviceUrl, env);

jmxConnector.connect();

MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();

return mBeanServerConnection;

}

//Método que muestra todos los MBeans disponibles

public void printAllMBeans(MBeanServerConnection mBeanServerConnection) throws IOException {

System.out.println(" \n\n Imprimiendo todos los MBean ");

Set mbeans = mBeanServerConnection.queryNames(null, null);

Iterator iter = mbeans.iterator();

while (iter.hasNext()) {

System.out.println(iter.next().toString());

ObjectName objectName = (ObjectName)iter.next();

System.out.println(" domain " + objectName.getDomain() + " " + objectName.getKeyPropertyListString());

}

System.out.println(" Fin de impresion \n\n ");

}

//Método que invoca a la operación "refreshConnectionPool" perteneciente al recurso "OrdenesCP" en una sola instancia OC4J

private void testSingle() throws MalformedURLException, IOException,

MalformedObjectNameException,

InstanceNotFoundException, MBeanException,

ReflectionException,

AttributeNotFoundException,

InvalidAttributeValueException {

MBeanServerConnection mBeanServerConnection = getMBeanConnection(OC4J_SOA_URL);

//printAllMBeans(mBeanServerConnection);

ObjectName objectName = new ObjectName(MBEAN_OBJECT_NAME);

System.out.println("\n\n Invoke Method over single oc4j ............");

Object invokeMethodReturnObject =

mBeanServerConnection.invoke(objectName, MBEAN_METHOD_NAME, null,

null);

//El retorno será = null pues la operacion es de tipo void

System.out.println(" Single invokeMethodReturnObject " +

invokeMethodReturnObject);

}

//Método que invoca a la operación "refreshConnectionPool" perteneciente al recurso "OrdenesCP" en un grupo (cluster) OC4J

public void testCluster() throws MalformedURLException, IOException,

MalformedObjectNameException,

InstanceNotFoundException, MBeanException,

ReflectionException,

AttributeNotFoundException,

InvalidAttributeValueException {

MBeanServerConnection mBeanServerConnection = getMBeanConnection(CLUSTER_OC4J_SOA_URL);

//printAllMBeans(mBeanServerConnection);

ObjectName clusterObjectName = new ObjectName(CLUSTER_MBEAN_OBJECT_NAME);

ObjectName customObjectName = new ObjectName(MBEAN_OBJECT_NAME);

Object[] invokeMethodParameters =

new Object[] { customObjectName, MBEAN_METHOD_NAME, null, null };

String[] invokeMethodSignature =

new String[] { "javax.management.ObjectName", "java.lang.String", "[Ljava.lang.Object;", "[Ljava.lang.String;" };

System.out.println("\n\n Invoke Method over cluster oc4j ............");

Object invokeMethodResult =

mBeanServerConnection.invoke(clusterObjectName, "invoke", invokeMethodParameters, invokeMethodSignature);

//El retorno será = null pues la operacion es de tipo void

System.out.println(" Cluster invokeMethodResult object is " + invokeMethodResult);

}

public static void main(String[] args) throws MalformedURLException,

IOException,

MalformedObjectNameException,

InstanceNotFoundException,

MBeanException,

ReflectionException,

AttributeNotFoundException,

InvalidAttributeValueException {

MBeansClient mBeanClient = new MBeansClient();

mBeanClient.testSingle();

mBeanClient.testCluster();

}

}

Especificaciones:

1.Modificar el IP del servidor y el puerto “Request” del opmn según corresponda. De igual modo, especificar el nombre correcto del OC4J correspondiente a la instalación del SOA Suite.

2. Modificar el IP del servidor y el puerto “Request” del opmn según corresponda.

3. El nombre correcto del MBean puede ser encontrado de la siguiente manera:

Ir al EM console –> oc4j_soa –>Administration –> System MBean Browser –> Cluster MBean Browser –> Operations –> getAttribute –> clip_image033 -> Buscar el recurso deseado

4. El nombre correcto del Cluster MBean puede ser encontrado de la siguiente manera:

Ir al em console –> oc4j_soa –> Administration –> System MBean Browser à Cluster MBean Browser -> Copiar el MBean Name

5. Especificar las credenciales apropiadas


Pasamos los 500 Artículos en Ingles

0

El día de hoy pasamos la barrera de los 500 artículos y ejemplos prácticos de ADF y JDeveloper coleccionados en un único repositorio. Estos artículos son en ingles y han sido escritos por bloggers de todo el mundo que quieren compartir sus experiencias y conocimiento sobre el ADF y JDeveloper.

Cualquier persona puede hacer búsquedas sobre este repositorio a través de la página principal de JDeveloper así como también pueden acceder al RSS feed del mismo o a través de la extensión que expliqué en un post anterior. Por nuestro lado (blogs en español) llevamos un total de 28 artículos + los que se encuentran en este blog asociados con ADF/JDeveloper y SOA.


xsi:type en Oracle BPEL PM 10.1.3.x ???

0

En semanas pasadas en un proyecto de implementación de BPEL PM en un cliente en México me encontré que uno de los servicios que se tenían que consumir desde Oracle BPEL PM, requerían forzosamente el uso del atributo xsi:type que algunos Web Services viejos requieren para ser ejecutados.

Este atributo sirve para explícitamente determinar el tipo del elemento que se está enviando, y hace un override al determinado en el namespace de dicho elemento.
En mi caso, si no específicaba el uso del atributo simplemente no obtenía respuesta correcta del servicio. Evidentemente la gente que lo había desarrollado no tenía forma de quitarle eso.
Afortunadamente hay un parámetro que se coloca en el bpel.xml del proceso BPEL que esté invocando al servicio, en donde puedes indicar si requieres de enviar o no el xsi:type. Esta información la encontró el consultor del partner que está implementando el proyecto (gracias Toño).

El parámetro es el siguiente:

Con ésto a nivel de partnerlink puede determinar el uso y envío del xsi:type en el body del mensaje soap.


¿Cómo comenzar con ADF/JSF/SOA/WebCenter?

0

Los Cue Cards, son una serie de 26 tutoriales, los cuales están divididos por tecnologías y a diferencia de las guías del desarrollador y los Oracle-By-Example, estos tutoriales son cortos y muy enfocado en proporcionar aspectos básicos de la tecnología.  En JDeveloper se pueden acceder los tutoriales a través del  menú Help->Cue Cards

A partir del TP4 de JDeveloper estos tutoriales se publicaron también en OTN y están ubicados en el siguiente link: http://www.oracle.com/technology/products/jdev/11/cuecards/index.html

 

Esta es una excelente herramienta para todos aquellos que quieran comenzar a familiarizarse con las distintas herramientas de desarrollo en Oracle Fusion Middleware de manera rápida.


JDeveloper TP4 Liberado en OTN

0

Acaba de ser liberado en OTN una nueva versión de JDeveloper 11g, justo a tiempo para JavaOne que va a ser la próxima semana en San Francisco. Esta versión es un Technical Preview4 lo cual indica que no es la versión final de JDeveloper 11g release1; Sin embargo, esto no quiere decir que no estemos trabajando activamente en los bugs de versiones anteriores y en las mejoras solicitadas, el detalle de las nuevas características de este release esta disponible en este enlace.

El software lo pueden descargar de aqui y esperamos nos den su retroalimentación a través del foro en OTN, contamos con ustedes para que JDev se ajuste de la mejor forma a sus requerimientos, recuerden que si tienen algún problema que quieran reportar el cual esta presente en alguno los TP pasados, es necesario que lo reproduzcan en este último TP4 para asegurarse que el bug no ha sido corregido.

Espero poder sacar tiempo para que continuemos evaluando más características nuevas de JDev11g.


El Ciclo de Vida de la Aplicación con ALM

0

El manejo de las practicas dentro del ciclo de vida del desarrollo de aplicaciones involucra elementos tales como requerimientos, versiones, pruebas, control de cambios, administración de errores, etc; estos elementos son luego integrados dentro de los procesos de la organización para así, gestionar la manera en que las distintas practicas de desarrollo están siendo o no aplicadas y que tan efectivas son estas prácticas dentro del proceso total de un producto terminado.

Susan Duncan quien hace parte del equipo de JDeveloper y ADF ha creado una encuesta para tener información acerca de que tipo de herramientas para gestionar el ciclo de vida del desarrollo de aplicaciones están siendo utilizadas por ustedes, con esta información se busca revisar el soporte que tiene JDeveloper para con estas herramientas y de la misma forma recoger requerimientos en cuanto al tipo de elementos que debemos estar soportando en versiones futuras del producto. Ayudenos a ayudarlo!!!

Pueden participar en la encuesta que está en ingles a través del siguiente enlace.


Nos Vemos en el POUG Developer Day!!

1

El 23 de Mayo tendré el placer de participar en el Developer Day organizado por el Grupo de Usuarios Oracle en Perú, la sesión que voy a realizar es la Introducción al Desarrollo en Oracle Fusión.

En esta sesión presentaré cual es el concepto detrás del desarrollo en Oracle Fusion, que tipo de blueprints se están creando, cuales son las herramientas que Oracle esta utilizando, las técnologías y la experiencia que se tiene del lado del desarrollador. En esta charla mostraré el estado del arte actual y que tenemos de nuevo en Oracle Fusion Middleware11g.

Espero nos podamos ver allí.


Trabajando con Listas de Valores en JDev11g - Parte 2

5

Tenia desde hace bastante tiempo este articulo planeado, pero una combinación de carga laboral, más otras actividades tienen mi horario bastante ajustado, sin embargo el blog es algo que por ahora no voy a dejar de un lado y espero continuar de manera activa la publicación de artículos.

Dejando un poco la introducción y entrando al tema, vimos en el post pasado como crear listas de valores. Esta vez vamos a ver como podemos asociar listas de valores a partir del modelo, lo cual se llama Listas de Valores en Cascada. Esta es una funcionalidad asociada con requerimientos tipo País/Estado/Ciudad, Ordenes/Detalle/Producto, etc.

Para este ejemplo vamos a tomar el esquema HR utilizando las tablas Locations, Regions y Countries. Y el objetivo final es el de crear/editar las distintas ubicaciones de los departamentos en este caso basándonos en la región, luego al país y finalmente al estado.

Nuestra estructura objetivo a nivel del modelo tiene los EOs y VOs que se crean con base en el modelo de datos a través del asistente. Adicionalmente se necesitan crear 2 VOs de lectura basados en un Query, estos son, FilterRegions y FilterState, los cuales cumplen la misión de filtrar las listas de valores con base en el elemento seleccionado.

Una características importante de los VOs que creamos para filtrar es que estos van a tener una clausula Where asociada que se implementa como una ViewCriteria, lo cual lo vimos en la primera parte de esta serie. Nuestros 2 VOs de filtrado quedan así

Ahora dentro del VO de Locations, lo que hice fue crear un atributo nuevo para efectos del demo llamado Region, este atributo va a filtrar las regiones con base en el regionID, la cual tiene varios países y luego miramos los estados del país. La parte importante aqui es que cuando creamos la Lista de valores para el país (CountryId) y estado(StateProvince) tenemos que primero asociar el VO de filtrado respectivo así

luego se edita la relación del View Accessor en donde vamos a seleccionar la viewCriteria que tiene el VO que filtra para así mapear la variable de la clausula where con uno de los atributos del VO Locations así:

Hacemos los mismo para el estado y con esto tendríamos el modelo listo. Para la parte del UI lo unico adicional que se tiene que hacer es especificar en las listas de valores las propiedades autosubmit para que así la acción de seleccionar sea enviada al servidor y este re-ejecute el query, la segunda propiedad es PartialTriggers en la cual vamos a especificar sobre que componente la lista de valores va a invocar un recarga (refresh) parcial para que se actualicen los valores con base en los datos del nuevo query que fue ejecutado.


Post navigation