Вызвать транзакционный метод в том же SFSB - PullRequest
2 голосов
/ 04 ноября 2011

Можно ли вызвать транзакционный метод из самого Stateful EJB?Чтобы говорить более четко:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
@Stateless
public class MyService {

    @Resource
    SessionContext ctx;

    public void myMethod()  {
        // do something...

        // invoke method from the same class

        // As expected - this doesn't work as it's a regular local-call, 
        // it's not aware of EJB nature of this call.
        save();

        // Doesn't work (although it worked with SLSB)
        ctx.getBusinessObject(MyService.class).save();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void save() {
        // do something...
    }
}

Теперь я хочу, чтобы пользователь вызвал myMethod ();Я хочу быть уверен, что этот метод выполняется без транзакции JTA.После этого вызова я хочу вызвать save ();метод, который будет выполняться в транзакции.

Если я использую метод ctx.getBusinessObject (-), я получаю:

ПРЕДУПРЕЖДЕНИЕ: системное исключение произошло во время вызова EJB MyServiceметод public void com.test.MyService.save () javax.ejb.IllegalLoopbackException: Незаконный повторный доступ : Попытка сделать возврат по петле для метода publicсессионный компонент MyService

Внутренние вызовы не поддерживаются для SFSB?

Я использую Glassfish 3.1.1.

1 Ответ

2 голосов
/ 04 ноября 2011

Это может быть ошибка в реализации Glassfish EJB. Это происходит не только при вызове метода с другим атрибутом транзакции, но и при каждом повторном входе в сессионный компонент с состоянием.

Просто попробуйте поместить простой тестовый метод в ваш компонент с состоянием и вызвать его через прокси бизнес-объекта. Вы получите то же исключение.

В JBoss AS 7 допускаются повторные входящие вызовы для компонентов с состоянием . Кстати, похожая ошибка присутствовала в OpenEJB некоторое время назад: https://issues.apache.org/jira/browse/OPENEJB-1099

...