Propagação de Transação EJB3

Eu tenho um bean sem monitoração de 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();
    }
}

O uso típico, em seguida, é o cliente chamaria processObjects (...), que realmente não interage com o gerenciador de entidades. Ele faz o que precisa fazer e chama process (...) individualmente para cada objeto a ser processado. A duração do processo (...) é relativamente curta, mas processObjects (...) pode levar muito tempo para executar tudo. Portanto, não quero que ele mantenha uma transação aberta. EuFaz&nbsp;precisam do processo individual (...) operações para operar dentro de sua própria transação. Esta deve ser uma nova transação para cada chamada. Por fim, gostaria de manter a opção aberta para o cliente chamar o processo (...) diretamente.

Eu tentei vários tipos de transações diferentes: nunca, não suportado, suportado (em processObjects) e obrigatório, requer novo (no processo), mas recebo TransactionRequiredException toda vez que merge () é chamado.

Eu consegui fazer isso dividindo os métodos em dois 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();
    }
}

mas ainda estou curioso para saber se é possível fazer isso em uma aula. Parece-me que o gerenciador de transações opera somente no nível do bean, mesmo quando os métodos individuais recebem anotações mais específicas. Então, se eu marcar um método de forma a impedir que a transação comece a chamar outros métodos dentro da mesma instância, também não criará uma transação, independentemente de como ela esteja marcada?

Estou usando o JBoss Application Server 4.2.1.GA, mas respostas não específicas são bem-vindas / preferidas.