Вызов метода транзакции в том же SFSB

Можно ли вызвать транзакционный метод из самого 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: Illegal Reentrant Access: Попытка выполнить обратный вызов метода ' public void com.test.MyService.save () для сеансового bean-компонента с сохранением состояния MyService

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

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


person Piotr Nowicki    schedule 03.11.2011    source источник
comment
Вы можете решить эту проблему, выполнив следующие действия: Внедрите ту же службу в свой класс, как этот @EJB private MyService self; а затем в myMethod () вызовите методы сохранения, подобные этому self.save (). Я пробовал это в wildfly8.   -  person anna    schedule 03.12.2015


Ответы (1)


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

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

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

person Arjan Tijms    schedule 04.11.2011
comment
Спасибо, Арьян. Да, я тестировал его без разных атрибутов Tx. Я опубликую это в Glassfish JIRA и посмотрю, что будет. - person Piotr Nowicki; 04.11.2011
comment
У вас есть URL-адрес вашей записи JIRA? Я воспроизвел проблему здесь (см. последний метод тестирования). Вы можете клонировать этот тестовый репозиторий Arquillian и протестировать проект, как это действительно легко. Профиль Maven по умолчанию использует удаленный адаптер Arquillian для GlassFish, поэтому пусть этот сервер запущен. Я прошел этот тест как для WildFly (бывший JBoss), так и для GlassFish, поскольку я не могу объявить победителя / проигравшего, используя только спецификацию EJB. - person Martin Andersson; 03.10.2014
comment
@MartinAndersson Тем временем я провел тест на это в [проект Java EE 7 Samples] (github.com/javaee-samples/javaee7-samples. Может быть, вы хотите внести свои тесты и в этот проект? Удобнее собрать все тесты в одном месте (у меня был отдельный набор тестов JASPIC, которые я тоже внесла) - person Arjan Tijms; 12.10.2014
comment
@PiotrNowicki Вы когда-нибудь создавали для этого GlassFish JIRA? - person Arjan Tijms; 12.10.2014
comment
Арьян сначала думал о том, чтобы стать участником, но предпочел мою текущую настройку проекта, где все представляет собой всего лишь один модуль Maven с тестовыми файлами, и все делается программно. Кроме того, моя долгосрочная цель - не просто доказать или опровергнуть концепции Java EE, но и создать превосходную документацию, которая объясняет как можно больше с помощью цитат из спецификаций. - person Martin Andersson; 13.10.2014
comment
Рассмотрим ваш новый тестовый пример в течение недели :) Большое спасибо вам обоим за вашу напряженную общественную работу. - person Martin Andersson; 13.10.2014