Posts Tagged ‘programación’

Modificar Parámetros Timeout JTA / BPEL en WLS (Oracle Weblogic Server 11g)

Jueves, enero 26th, 2012

Antes de empezar, debo decirles que esto lo probé en una máquina con Oracle BPM 11g (11.1.1.4) y el problema que presentaba es que a los 5 minutos un servicio web que ejecutaba un PL-SQL en la BD a través de un DB Adapter misteriosamente se cancelaba. A continuación les muestro el log que aparecía en el servidor SOA:

Caused by: BINDING.JCA-11811
Stored procedure invocation error.
Error while trying to prepare and execute the SCHEMA01.PKG01.PLSQL01 API.
An error occurred while preparing and executing the SCHEMA01.PKG01.PLSQL01 API.
Cause: java.sql.SQLTimeoutException: ORA-01013: user requested cancel of current operation
ORA-06512: at "SCHEMA01.PKG01", line 1206
ORA-06512: at "SCHEMA01.PKG01", line 1176
ORA-06512: at line 1

Check to ensure that the API is defined in the database and that the parameters match the signature of the API.  This exception is considered retriable, likely due to a communication failure.  Because the global transaction is rolling back the invoke must be retried in a new transaction, restarting from the place of the last transaction commit.  To classify it as non-retriable instead add property nonRetriableErrorCodes with value "1013" to your deployment descriptor (i.e. weblogic-ra.xml).

    at oracle.tip.adapter.db.exceptions.DBResourceException.createXARetriableException(DBResourceException.java:670)
    at oracle.tip.adapter.db.exceptions.DBResourceException.createEISException(DBResourceException.java:642)
    at oracle.tip.adapter.db.sp.SPUtil.createResourceException(SPUtil.java:175)
    at oracle.tip.adapter.db.sp.AbstractStoredProcedure.execute(AbstractStoredProcedure.java:131)
    at oracle.tip.adapter.db.sp.SPInteraction.executeStoredProcedure(SPInteraction.java:141)
    at oracle.tip.adapter.db.DBInteraction.executeStoredProcedure(DBInteraction.java:1102)
    at oracle.tip.adapter.db.DBInteraction.execute(DBInteraction.java:247)
    at oracle.integration.platform.blocks.adapter.fw.jca.cci.JCAInteractionInvoker.executeJcaInteraction(JCAInteractionInvoker.java:311)
    ... 102 more

Para corregir este error de timeout obtuve cierta información que espero sea de utilidad para alguien más. Los pasos para cambiar los parámetros de timeout tanto en JTA como en BPEL son:

1. Configuración syncMaxWaitTime: Esta propiedad controla el tiempo máximo que se espera un resultado en un proceso sincronizado.

• Iniciar sesión en EM como administrador.
• Abrir SOA y click derecho sobre “soa-infra”.
• Seleccionar: SOA Administration -> BPEL Properties
• Dar click sobre “More BPEL Configuration Properties…”
• Localizar el atributo syncMaxWaitTime y cambiarlo.

2. Configuración del tiempo de transacción de EJB de BPEL: Permite modificar las propiedades de tiempo de espera (timeout) para la aplicación SOA, ignorando la configuración global especificada en los parámetros JTA.
• Acceda a la consola de administración de Oracle WebLogic.
• Haga clic Deployments.
• Ampliar soa-infra –> EJB.
• Los siguientes EJBs deben actualizarse:

BPELActivityManagerBean
BPELDeliveryBean
BPELDispatcherBean
BPELEngineBean
BPELFinderBean
BPELInstanceManagerBean
BPELProcessManagerBean
BPELSensorValuesBean
BPELServerManagerBean

• Puede consultar en la pestaña de configuración el timeout para los beans que coincidan con el filtro “EJB*BPEL” (podría haber más beans si su versión es diferente).
• Haga clic en Guardar.
• Reiniciar Oracle WebLogic Server.

3. Ajuste del timeout de transacción global a nivel de dominio WebLogic: Esta propiedad controla el tiempo de espera para las transacciones activas. Si la transacción está todavía en estado “activo” después de ese tiempo, automáticamente se revierte (rolled back).

• Acceda a la consola de administración de Oracle WebLogic.
• Haga clic en Servicios -> JTA.
• Cambie el valor de segundos del tiempo de espera (timeout, por defecto es 30).
• Haga clic en Guardar.
• Reinicie Oracle WebLogic Server.

En mi caso se modifiqué los valores de timeout JTA a:

• Timeout Seconds: 6000
• Completion Timeout: -1 (en opciones avanzadas)
• Maximum Duration of XA Calls: 6000000 (en opciones avanzadas)

Las transacciones se establecen a 6000 segundos que equivale a 1.6 horas.

Algunos enlaces de interés (parte de la información fue obtenida de estas fuentes):

  • http://forums.oracle.com/forums/thread.jspa?threadID=2279364
  • http://sudhakarsoa.blogspot.com/2011/03/how-do-you-configure-transaction.html

¿Qué es computación distribuida y en Grid?

Martes, diciembre 27th, 2011

La computación distribuida o informática en malla, es un nuevo modelo para resolver problemas de computación masiva utilizando un gran número de computadoras organizadas en racimos incrustados en una infraestructura de telecomunicaciones distribuida.

La computación en grid es una tecnología innovadora que permite utilizar de forma coordinada todo tipo de recursos (entre ellos cómputo, almacenamiento y aplicaciones específicas) que no están sujetos a un control centralizado.

En este sentido es una nueva forma de computación distribuida, en la cual los recursos pueden ser heterogéneos (diferentes arquitecturas, supercomputadores, clusters…) y se encuentran conectados mediante redes de área extensa (por ejemplo Internet). Desarrollado en ámbitos científicos a principios de los años 1990, su entrada al mercado comercial siguiendo la idea de la llamada Utility computing supone una revolución que dará mucho que hablar.

El término grid se refiere a una infraestructura que permite la integración y el uso colectivo de ordenadores de alto rendimiento, redes y bases de datos que son propiedad y están administrados por diferentes instituciones. Puesto que la colaboración entre instituciones envuelve un intercambio de datos, o de tiempo de computación, el propósito del grid es facilitar la integración de recursos computacionales. Universidades, laboratorios de investigación o empresas se asocian para formar grid para lo cual utilizan algún tipo de software que implemente este concepto.

Para no extendernos en los conceptos les recomiendo visitar los siguientes enlaces:

  • Conceptos

    http://es.wikipedia.org/wiki/Computaci%C3%B3n_distribuida

    http://es.wikipedia.org/wiki/Computaci%C3%B3n_grid

  • EhCache con Spring (Spring Framework se integra perfectamente con EhCache, tanto sea a través de clases utilitarias “oficiales” como usando librerías adicionales que brindan una mejor integración)

    http://www.dosideas.com/wiki/EhCache_Con_Spring

  • Terracota

    http://www.dosideas.com/noticias/java/271-introduccion-a-terracotta.html

    http://www.terracotta.org/

  • Infinispan
    http://unpocodejava.wordpress.com/2010/09/15/getting-started-with-infinispan/

Cálculo de la edad, creación de fechas y años bisiestos en Java

Martes, diciembre 27th, 2011

CALCULO DE LA EDAD

Tenemos al menos dos formas de calcular la edad en Java:

  1. La podemos calcular en milisegundos, entregando la cuenta exacta de milisegundos desde que la persona nació.
  2. Otra forma un poco más orientada al negocio para el que se esté construyendo el sistema es simplemente entregar el número de años que tiene la persona (como entero), ya que en los procesos financieros muchas veces no cuenta la edad real sino la edad establecida por el uso de la sociedad (en este caso el número de años).

Para la mayoría de casos preferiremos usar el segundo método ya que es la forma común en que entendemos la edad. Veamos esto en detalle (y con código):

Forma 1
Obtendremos la diferencia en milisegundos. Esta cantidad la puedes pasar a segundos, minutos, días o años, de acuerdo a la necesidad específica.

public long calcularEdadEnMilis(Date fechaNacimiento, Date fechaActual) {
    long diferencia = ( fechaActual.getTime() - fechaNacimiento.getTime() )
    return diferencia;
}

Forma 2
Haremos una resta sencilla: Si ya cumplió años en el año en curso, la edad es la diferencia de años. Si aún no cumple años, la edad es la diferencia de años menos uno. Recordemos que este código podría no aplicar para sociedades con otras formas culturales de calcular la edad (o que usa un calendario distinto a los conocidos).

public int calcularEdad(Date fechaNacimiento, Date fechaActual){
    Calendar fechaAct = Calendar.getInstance();
    fechaAct.setTime(fechaActual);

    Calendar fechaNac = Calendar.getInstance();
    fechaNac.setTime(fechaNacimiento);

    int dif_anios = fechaAct.get(Calendar.YEAR) - fechaNac.get(Calendar.YEAR);
    int dif_meses = fechaAct.get(Calendar.MONTH) - fechaNac.get(Calendar.MONTH);
    int dif_dias = fechaAct.get(Calendar.DAY_OF_MONTH) - fechaNac.get(Calendar.DAY_OF_MONTH);

    //Si está en ese año pero todavía no los ha cumplido
    if(dif_meses<0 || (dif_meses==0 && dif_dias<0)){
        dif_anios--;
    }
    return dif_anios;
}

CREACION DE FECHAS

Sólo por curiosidad: ¿Cómo creas tus fechas?
Una forma correcta de hacerlo es:

public Date crearFechas(int anio, int mes, int dia){
	Calendar fecha = Calendar.getInstance();
	fecha.clear(); //establece valores a 0
	fecha.set(anio, mes-1, dia); //establece año, mes y dia
	return fecha.getTime();
}

AÑOS BISIESTOS

Para saber si un año es bisiesto se puede aplicar una simple formula: Un año es bisiesto si es divisible entre 4, excepto el último de cada siglo (aquel divisible por 100), salvo que este último sea divisible por 400.

if ((anio % 4 == 0) && ((anio % 100 != 0) || (anio % 400 == 0)))
	System.out.println("El año es bisiesto");
else
	System.out.println("El año no es bisiesto");

Pero la mejor forma es usar Java al máximo, así:

public boolean esBisiesto(int anio) {
	GregorianCalendar calendar = new GregorianCalendar();
	return calendar.isLeapYear(anio);
}

(Nótese que esto sólo aplica para calendarios gregorianos)

Algunos enlaces de interés:

  • http://americati.com/blog/?p=79
  • http://draxus.org/weblog/2008/04/15/calcular-edad-en-java/
  • http://lineadecodigo.com/java/ano-bisiesto-en-java/
  • http://es.wikipedia.org/wiki/A%C3%B1o_bisiesto

Programación orientada a eventos (event-driven, event oriented programming)

Miércoles, septiembre 8th, 2010

He estado revisando un tema interesante de programación orientada a eventos y me he animado a compartirles un poco de lo que he leído.

Para empezar: ¿Qué es un evento?
Un evento es una ocurrencia dentro de un determinado sistema o dominio, es
algo que ha ocurrido o que se contempla que va a ocurrir en ese
dominio. El término evento también se usa cuando una entidad de programación representa
una ocurrencia en un sistema de cómputo.

Comportamiento manejado por eventos (Event-Driven behavior) en la vida cotidiana
El concepto de evento es simple pero poderoso. Suponga que usted está trabajando en su computadora portátil en
una cafetería, desde que ha entrado a esta cafetería han sucedido varias cosas:

  • La gente ha entrado y salido.
  • Has pedido un café.
  • La camarera te ha traído el café.

Estas son acontecimientos, pero ninguno de ellos es particularmente emocionante. Imagina ahora:

  • Un ladrón entra a la cafetería.
  • El ladrón exige el dinero de la gente.
  • La camarera te ha traído el café.

Esto perturbaría la atmósfera pacífica y obliga a la gente a reaccionar. Supongamos que alguien da
sus pertenencias al ladrón, lo que provoca más eventos, después de recuperarse del shock:

  • La víctima llama a las compañías de tarjetas de crédito para cancelar sus tarjetas de crédito robadas.

Que a su vez esto daría lugar a nuevas actividades.

En resumen, todo lo ocurrido, emocionante o no, puede ser visto como una ocurrencia, es decir un evento.

Tipos de Eventos

Los eventos pueden ser síncronos o asíncronos.

Evento Síncrono:
Estamos tratando con un evento síncrono si es necesario esperar una respuesta inmediatamente después de lanzado el evento.

  • Pago el café y espero a que me lo entreguen.

Evento Asíncrono
En este caso no es necesario esperar inmediatamente una respuesta, la respuesta puede llegar después, en un tiempo indeterminado.

  • Pago el café y me voy a la mesa, a que me lo lleven.

Actores en un evento
En un sistema que administra eventos tenemos:

  • Productores de eventos,
  • Consumidores, y
  • El componente que resuelve la lógica del procesamiento de los eventos.

Categorías de las aplicaciones que procesan eventos

Razones para el uso de un procesamiento de eventos
Una pregunta que podría plantearse es por qué desea utilizar un procesamiento de eventos.
He aquí algunas razones:

  • La aplicación podría estar centrada en eventos de forma natural.
    En este caso la aplicación tiene sensores que detectan y reportan eventos,
    y la razón de ser de la aplicación es analizar y reaccionar a estos acontecimientos.
  • La aplicación necesita identificar y reaccionar ante determinadas situaciones (
    buenas o malas) a medida que ocurren. Un enfoque orientado a eventos, donde los cambios en el estado
    se monitorean a medida que ocurren, permite que la aplicación responda de manera más
    oportuna que un enfoque en segundo plano cuando el proceso de detección sólo se ejecuta
    de manera intermitente.
  • El procesamiento de eventos pueden dar una forma de extender una aplicación ya existente de una
    manera flexible, no invasiva. En lugar de modificar la aplicación inicial para
    agregar funciones adicionales, a veces es posible modificar la aplicación original
    mediante la adición de productores de eventos a la misma (por ejemplo, al procesar el archivo de logs
    que se produce). La funcionalidad adicional puede ser implementada
    procesando los eventos generados por estos productores de eventos.
  • La lógica para el procesamiento de eventos se puede separar del resto de la
    aplicación. Esto permite que la aplicación se adapte rápidamente para satisfacer los nuevos
    requerimientos de negocio, a veces adaptada por los mismos usuarios de las aplicaciones de negocio.
  • La aplicación podría implicar el análisis de una gran cantidad de datos con el fin de
    proporcionar una salida a ser entregada a un usuario humano u otra aplicación. Los datos
    se pueden organizar en un flujo de sucesos que luego son distribuidos a múltiples
    nodos de cómputo que permite separar las partes del análisis que se realice
    en paralelo.
  • Hay beneficios potenciales en la escalabilidad y la tolerancia a fallos que se pueden obtener
    mediante el uso de
    un enfoque orientado a eventos. Un enfoque orientado a eventos permite sucesos que se
    realizan de forma asincrónica, por lo que es ideal para aplicaciones donde los eventos
    suceden de forma irregular.

Espero esta información les sea de utilidad.
Para más información pueden revisar los siguientes libros:

  • Event Processing in Action:
    Opher Etzion, Peter Niblett.
    Ed. Manning
    ISBN: 9781935182214
  • Event-Based Programming. Taking Events to the Limit:
    Ted Faison.
    Ed. Apress.
    ISBN-13: 978-1-59059-643-2
    ISBN-10: 1-59059-643-9

Y un enlace interesante es: