4TIC
 
  • Increase font size
  • Default font size
  • Decrease font size

Inclusión de bloques de código anónimos en transacciones

Mientras Java en su versión 7.0, parece que puede por fin adoptar un mecanismo claro de Closures, hay ciertos patrones de diseño que pueden ayudarnos.

Para comenzar, dejaremos claro que nuestro objetivo: Poder insertar un bloque de código puntual, específico y variable entre el código que define una función ya existente.

Para entender mejor esta declaración, lo mejor es definir un ejemplo.

Partimos de una función que realiza una transacción de base de datos mediante JPA:
    public Object update(Object entity)
    {
        EntityManager em = emf.createEntityManager();
        EntityTransaction transaction = em.getTransaction();

        transaction.begin();
        em.merge(entity);       
        transaction.commit();

        return entity;
    }

El problema viene cuando queremos completar el envío de un mensaje dentro de la misma transacción, es decir, que si el envió falla, queremos que la transacción global se interrumpa. Por supuesto, el código asociado al envío del mensaje es variable y puede ser totalmente distinto para cada ejecución.

Este escenario plantea un grave problema, ya que no podemos "inyectar" el código que queremos dentro de la función "update" debido a que cada vez es distinto y además no podemos pasar funciones anónimas como parámetros como en JavaScript (closures).

Para solucionar esta situación, podemos diseñar un intefaz común que describa la función anónima que nos gustaría poder pasar como parámetro. Por ejemplo:

    public interface EventSender<T>
    {
        public void dispatch(T entity) throws Exception;
    }

A continuación, modificaremos la función "update" para que pueda recibir una instancia de esta interfaz como parámetro. A partir de este momento tendremos que usar "generics" en esta función para que el parámetro del procedimiento "dispatch" pueda adoptar cualquier tipo:

    public <T> T update(T entity, EventSender<T> eventSender) throws Exception
    {
        EntityManager em = emf.createEntityManager();
        EntityTransaction transaction = em.getTransaction();

        transaction.begin();
        em.merge(entity);      
        eventSender.dispatch(entity);       
        transaction.commit();

        return entity;
    } 

Por último, sólo tenemos que modificar la llamada al método "update" para poder empezar a pasarle el código de envío de mensajes que creamos oportuno en cada caso:

    this.baseDAO.update(document, new EventSender<Document>() {
        public void dispatch(Document entity) throws Exception
        {
            // codigo asociado el envío que quiero realizar
         }
   });
 

Add comment


Security code
Refresh

Documentación

Collaborations


4TIC colabora con decharlas.com para la difusión de la tecnología en Castellón
4TIC apuesta por el conocimiento abierto y se convierte en patrocinador oficial de decharlas.com para la organización de charlas técnicas gratuitas en Castellón.
 
4TIC signs an agreement with UJI for marketing CryptoApplet
4TIC has signed an agreement with the Universitat Jaume I of Castellón, to obtain a commercial license of CryptoApplet, becoming the first enterprise to give commercial support and developing new functionalities over this product

The existence of a commercial license is very important for usign CryptoApplet in non open source projects or in projects that don't meet the restrictions given by GPL license used by CryptoApplet.

 
4State in the "Montserrat Tarradellas i Macià" archive

The Universitat Rovira i Virgili coordinates the project for the digitization and transcription of the historical background from "Montserrat Tarradellas i Macià" archive in the Monasterio de Poblet (Tarragona), using 4State to give support to the transcription and and digital archive of the historical material.

 
SafeNet certification

4TIC has become an official partner of SafeNet and has certified his product of digital signature 4Sign for the use of SafeNet's hardware key storage module: SafeNet Luna HSM

 
VIGIA in the Universitat Rovira i Virgili

The Universitat Rovira i Virgili of Tarragona, has choosenVIGIA for managing their SALTO installation, which now has 1500 doors.