Desarrollo de proxies contextuales que utilizan propiedades de ejecución

Utilice un gestor de trabajo como un ContextService (servicio contextual) para contextualizar la invocación de una interfaz, y especificar las propiedades de ejecución para controlar cómo se captura y se aplica el contexto de hebra a la hebra de ejecución.

Acerca de esta tarea

Los componentes de aplicación que necesiten que haya un contexto de hilo cuando se invocan los métodos de un objeto pueden usar un gestor de trabajo, que implementa javax.enterprise.concurrent.ContextService, para construir un proxy contextual del objeto. Cuando se crea el proxy contextual, se captura el contexto de hilos conforme a la configuración del gestor de trabajo. Cuando se invocan los métodos de interfaces en el proxy contextual, el contexto de hilos capturado se aplica antes de la invocación y se restaura después.

Puede especificar las propiedades de ejecución para un proxy contextual, para controlar cómo se captura y se aplica el contexto de hebra. Por ejemplo, los métodos de proxy contextuales se invocan con cualquier transacción que ya esté en la hebra de ejecución suspendida, a menos que se utilice una propiedad de ejecución para alterar temporalmente este comportamiento.

Procedimiento

  1. Defina una interfaz (o elija una interfaz existente que resulte adecuada) con los métodos que requieran un contexto de hilos.
    public interface AddressFinder {
        Address getAddress(Person p) throws Exception;
    }
  2. Proporcione una implementación de la interfaz:
    public class DatabaseAddressFinder implements AddressFinder {
        private final String resRefLookupName;
        public DatabaseAddressFinder(String resRefLookupName) {
            this.resRefLookupName = resRefLookupName;
        }
        public Address getAddress(Person p) throws Exception {
            // La búsqueda de referencias de recurso requiere el contexto de hilos del
            // componente de aplicación que define la referencia de recurso.
            DataSource ds = (DataSource) new InitialContext().lookup(
                resRefLookupName);
            Connection con = ds.getConnection();
            try {
                ResultSet r = con.createStatement().executeQuery(
                    "SELECT STREETADDR, CITY, STATE, ZIP " +
                    "FROM ADDRESSES WHERE PERSONID=" + p.id);
                if (r.next())
                    return new Address(r.getString(1), r.getString(2),
                        r.getString(3), r.getInt(4));
                else
                    return null;
            } finally {
                con.close();
            }
        }
    }
  3. Utilice un servicio de contexto para capturar el contexto del hilo actual y envolver una instancia con ese contexto, mientras se aplica un conjunto de propiedades de ejecución:
    ContextService contextService = (ContextService) new InitialContext().lookup(
        "java:comp/DefaultContextService");
    Map<String, String> executionProperties =Collections.singletonMap(
        ManagedTask.TRANSACTION,
        ManagedTask.USE_TRANSACTION_OF_EXECUTION_THREAD)
    AddressFinder addressFinder = contextService.createContextualProxy(
        new DatabaseAddressFinder("java:comp/env/jdbc/MyDataSourceRef"),
        executionProperties,
        AddressFinder.class);
  4. Desde otro hilo, utilice el proxy contextual para invocar métodos en el contexto del hilo original.
    transaction.begin();
    try {
        Address miDireccion = addressFinder.getAddress(me);    updateShippingInfo(myAddress);
    } finally {
        transaction.commit();
    }

Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tasb_execprops_cproxies
File name: tasb_execprops_cproxies.html