Ejecutar una tarea asincrona en java con spring

A veces necesitamos ejecutar una tarea que lleva un tiempo considerable y que el usuario no necesariamente necesita ser informado en el momento, por ejemplo el envío de un correo de notificación (en algunos casos), el hacer un proceso x que lleva tiempo, etc…

La clase TaskExecutor de spring abstrae la de java.concurrent.Executor de manera tal que es mucho mas facil con spring, SimpleAsyncTaskExecutor (asincrono), SyncTaskExecutor (sincrono), SimpleThreadPoolTaskExecutor y otros mas.

Pongo un ejemplo del uso del SimpleAsyncTaskExecutor
[java]
private TaskExecutor taskExecutor;

public void setTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}

taskExecutor.execute(new Runnable(){
public void run() {

}
});
[/java]
Aquí mostramos la configuración de nuestra clase usando un TaskExecutor en spring.
[xml]
<bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor"/>

<bean id="myBean" class="org.myproject.MyBean">
<property name="taskExecutor" ref="taskExecutor"/>
</bean>
[/xml]
Cuando usamos hibernate y tenemos relaciones “lazy” en nuestros objetos que son traidos con hibernate, esto nos puede traer problemas al usar simplemente el TaskExecutor, tenemos que hacer una especia de OpenSessionInThread para poder tener la session abierta y que se reutilice esa session a lo largo del codigo ejecutado.

Pongo un ejemplo de como seria esa implementación. El código es similar a la implementación del OpenSessionInViewFilter de spring.
[java]
public abstract class OpenSessionInThreadTask implements Runnable{

private ApplicationContext ctx;

public OpenSessionInThreadTask(ApplicationContext ctx) {
this.ctx = ctx;
}

protected abstract void runInternal();

public final void run(){
SessionFactory sessionFactory = lookupSessionFactory();
boolean participate = false;

// single session mode
if (TransactionSynchronizationManager.hasResource(sessionFactory)) {
// Do not modify the Session: just set the participate flag.
participate = true;
}
else {
Session session = getSession(sessionFactory);
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));
}

try{
runInternal();
}

finally {
if (!participate) {
// single session mode
SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.unbindResource(sessionFactory);
closeSession(sessionHolder.getSession(), sessionFactory);
}
}
}

protected SessionFactory lookupSessionFactory() {
return ctx.getBean("sessionFactory", SessionFactory.class);
}

protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
Session session = SessionFactoryUtils.getSession(sessionFactory, true);
FlushMode flushMode = FlushMode.MANUAL;
if (flushMode != null) {
session.setFlushMode(flushMode);
}
return session;
}

protected void closeSession(Session session, SessionFactory sessionFactory) {
SessionFactoryUtils.closeSession(session);
}

}
[/java]
Y por ultimo el uso de la clase OpenSessionInThreadTask, de hecho esta clase ya se encuentra en forza.
[java]
taskExecutor.execute(new OpenSessionInThreadTask(ctx){
public void runInternal() {
….
}
});
[/java]

Bueno espero que haya sido de su ayuda, no olviden dejar en los comentarios cualquier duda o aporte.

Computacion en la nube?

Computer Rack

Cloud Computing promises to increase the velocity with which applications are deployed, increase innovation and lower costs.  Introduction to Cloud Computing Architecture. SUN

La traducción: Cloud Computing promete aumentar la velocidad de instalacion de aplicaciones, incrementar la innovacion y reducir costos. Fuente: Introduccion a la Arquitectura Cloud Computing.

En español internacional, y multidiciplinario, lo anterior significa que al utilizar la arquitectura de Cloud Computing como Amazon EC2, la instalación de los programas se facilita, y nos permite preocuparnos por factores mas sensibles de nuestras aplicaciones. Los recursos en la nube son facilmente escalables, dado a que no se depende solamente de un equipo de hardware, si no de varios, una “Granja” de equipos interconectados a manera de compartir recursos de memoria, procesamiento y almacenamiento. Esto ultimo esta basado en una particularidad de la arquitectura de Cloud Computing, que es “virtualización”

¿Pero que es Cloud Computing?

De acuerdo a SUN Cloud Computing es el uso de tecnologías de información como servicio (SaS: Software as a Service) en la red. Se define como servicios encapsulados, que tienen un API y estan disponibles a traves de la red. Esta definición incluye el uso de recursos de procesamiento y almacenamiento de datos como servicios. Cloud Computing esta basado en el principio de “Eficiencia ante todo” eficiencia que produce herramientas de alto nivel para manejar el 80% de los casos de uso para que las aplicaciones puedan ser creadas e instaladas con una facilidad impresionante.

El modelo predominante de Cloud Computing es IaaS (Infrastructure as a Service), esta tomando el mercado de TI de una forma muy rapida y concreta, debido a que brinda la ilusión de que los recursos son infinitos. La arquitectura de Cloud Computing puede ser montada sobre un Data Center privado, o uno contratado por una empresa que asume todo el riesgo de poseer la infraestructura.

Cloud Computing, incopora virtualización, instalación en demanda, software de codigo abierto, y servicios cosumidos a traves de Internet.

De estos temas estaremos hablando en los siguientes articulos sobre Cloud Computing.

Esperamos, que esta serie les sea de utilidad. Creemos que el adopatar la arquitectura de Cloud Computing, en una etapa temprana, colocara a los desarrolladores de software en la cresta de la ola, de una nueva era de Tecnologías de información.

Saludos,

Iaax Page

Ajax y Librerias Javascript

Ajax and Javascript

Ajax y librerias javascript

Ajax: Asynchronous JavaScript and XML, es un desarrollo atribuido en forma original a Microsoft, si bine quiza Microsoft jamas penso en llamarlo de esta manera, si fueron ellos los pioneros en realizar llamadas asincornas que permitian la actualizacion de cirta parte de la informacion en sitios web.

Originalmente, Ajax estaba basado en el consumo de servicios web que devolvian XML. De ahi la X de su nombre. Sin embargo JSON aparecio casi de la nada para convertirse en uno de los formatos mas importantes de nuestros tiempos.

JSON o Java Script Object Notation, como lo mencionames en el podcast de ORMs, fue desarrollado basado en YAML,

Lista de Librerias JS

Nuestras recomendaciones para la seleccion de una libreria JS es basarse en las necesidades especificas de tu desarrollo. Algunas de estas herramientas estan mas orientadas a aplicaciones Web, como lo son ExtJS, YUI y JQuery, mientras que Scriptaculous, y Prototype estan orientadas a funcionalidades esteticas.

Si nuestra necesidades es desarrollar front ends, que permitan el consumo de servicios web y presentar informacion en forma dinamica, quiza JQuery, Ext y YUI sean las mejores opciones para estos fines. Mientras que si el proposito es desarrollar efectos de presentacion, se puede optar por alguna libreria basada en Prototype, como Scriptaculous.

Mas importante que el hecho de utilizar una libreria de JS como las anteriores, es enteder su funcionamiento, para ello, lo mejor es estudiar su API, y sobre todo tener un entendimiento amplio del Document Object Model, definido por la W3C, donde tambien podemos encontrar la definicion de DTD. Es importante recalcar que recomendamos que para nuevos desarrollos se opte por usar los modelos Strict, en lugar de los transitional, ya que estos ultimos son pensados por compatibilidad hacia tecnologias antiguas, de modo tal que en un futuro todas las definiciones de DTDs Transitional quedaran obsoletas.