Propagación de Transacciones EJB3

Tengo un frijol sin estado algo como:

@Stateless
public class MyStatelessBean implements MyStatelessLocal, MyStatelessRemote {
    @PersistenceContext(unitName="myPC")
    private EntityManager mgr;

    @TransationAttribute(TransactionAttributeType.SUPPORTED)
    public void processObjects(List<Object> objs) {
        // this method just processes the data; no need for a transaction
        for(Object obj : objs) {
            this.process(obj);
        }
    }

    @TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void process(Object obj) {
        // do some work with obj that must be in the scope of a transaction

        this.mgr.merge(obj);
        // ...
        this.mgr.merge(obj);
        // ...
        this.mgr.flush();
    }
}

El uso típico entonces es que el cliente llamaría a processObjects (...), que en realidad no interactúa con el administrador de entidades. Hace lo que debe hacer y llama al proceso (...) individualmente para que cada objeto lo procese. La duración del proceso (...) es relativamente corta, pero processObjects (...) puede tardar mucho tiempo en ejecutarse en todo. Por lo tanto no quiero que mantenga una transacción abierta. yohacer necesita las operaciones de proceso individual (...) para operar dentro de su propia transacción. Esto debería ser una nueva transacción para cada llamada. Por último, me gustaría mantener la opción abierta para que el cliente llame al proceso (...) directamente.

He intentado varios tipos de transacciones diferentes: nunca, no es compatible, es compatible (en processObjects) y es obligatorio, requiere nuevo (en proceso) pero obtengo TransactionRequiredException cada vez que se llama a merge ().

He podido hacer que funcione dividiendo los métodos en dos beans diferentes:

@Stateless
@TransationAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MyStatelessBean1 implements MyStatelessLocal1, MyStatelessRemote1 {
    @EJB
    private MyStatelessBean2 myBean2;

    public void processObjects(List<Object> objs) {
        // this method just processes the data; no need for a transaction
        for(Object obj : objs) {
            this.myBean2.process(obj);
        }
    }
}

@Stateless
public class MyStatelessBean2 implements MyStatelessLocal2, MyStatelessRemote2 {
    @PersistenceContext(unitName="myPC")
    private EntityManager mgr;

    @TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void process(Object obj) {
        // do some work with obj that must be in the scope of a transaction

        this.mgr.merge(obj);
        // ...
        this.mgr.merge(obj);
        // ...
        this.mgr.flush();
    }
}

pero sigo sintiendo curiosidad por si es posible lograr esto en una clase. Me parece que el administrador de transacciones solo opera a nivel de bean, incluso cuando a los métodos individuales se les dan anotaciones más específicas. Entonces, si marco un método para evitar que la transacción comience a llamar a otros métodos dentro de la misma instancia, tampoco se creará una transacción, sin importar cómo se marquen.

Estoy usando JBoss Application Server 4.2.1.GA, pero las respuestas no específicas son bienvenidas / preferidas.

Respuestas a la pregunta(8)

Su respuesta a la pregunta