2014-01-13 2 views
0

Я занимаюсь разработкой веб-службы с использованием автономного EJB, который имеет единственную точку входа (метод). Этот метод имеет 3 шага, и я хочу, чтобы шаг 1 выполнялся в другой транзакции, чем шаги 2 и 3 (которые должны быть в одной транзакции). Эти «шаги» состоят в призывах к инъекционным EJB без гражданства. Позвольте мне объяснить, с каким-то кодом:EJB Сделки

@Stateless 
@WebService(...) 
public class MyWebServiceImpl implements MyWebService { 

    @EJB 
    private UserBusinessBean userBusinessBean; 

    @EJB 
    private EventsBusinessBean eventsBusinessBean; 

    @WebMethod(...) 
    public MyWebServiceResult process(MyWebServiceParam param) { 
      // extract data from param 
      EventResult createEventResult = eventsBusinessBean.createEvent(data); // step 1 
      // do some extra processing 
      User user = userBusinessBean.createUser(someData); // step 2 
      // do some extra processing 
      EventResult updateEventResult = eventsBusinessBean.updateEvent(moreData); // step 3 
    } 
} 

2-впрыскивается EJBs сами Stateless и вводят ссылки на лицо без DAO,, функция которых заключается в вызов хранимых процедур в базе данных.

Мне нужно, чтобы шаг 1 выполнялся в одной транзакции, а шаги 2 и 3 выполнялись в другой транзакции (потому что, если сбой в шаге 2 или 3, информация с шага 1 уже выполнена).

Я знаю, что у меня есть 2 варианта реализации этого: транзакции контейнер-менеджер или транзакции, управляемые пользователем. Я считаю, что прежний подход более безопасен, чем последний, делегируя управление контейнеру (в моем случае, сервер Weblogic). Но я не могу понять, как я должен использовать аннотации транзакций EJB для реализации этой логики. Должен ли я комментировать методы из моих бизнес-бобов? А как насчет DAO, им тоже нужны аннотации? И какие из них я должен использовать?

Надеюсь, вы можете помочь мне в этом. Дайте мне знать, если вам нужно узнать подробности из моей реализации.

ответ

0

Поскольку MyWebServiceImpl является @Stateless, он неявно имеет атрибут транзакции REQUIRED. Чтобы убедиться, что шаг 1 завершен в своей собственной транзакции, вы должны добавить @TransactionAttribute(REQUIRES_NEW) в метод EventsBusinessBean.createBean. Это приведет к созданию компонента в его собственной транзакции, а затем остальные действия в process будут работать в рамках другой транзакции.

+0

Это решило проблему. Я забыл этот неявный атрибут «REQUIRED» моего компонента веб-службы. Мне пришлось сделать дополнительную работу, бросая 'ApplicationException' для отката транзакций. Благодаря! – Baderous

+0

Для проверки DAO http://stackoverflow.com/questions/3223112/javaee6-dao-should-it-be-stateless-or-applicationscoped (в нескольких словах DAO не должны быть EJB). –

Смежные вопросы