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 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.

questionAnswers(8)

yourAnswerToTheQuestion