powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JTA Транзакции в EJB приложении
12 сообщений из 12, страница 1 из 1
JTA Транзакции в EJB приложении
    #38966376
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться в этом интересном вопросе.

Имеется JBoss 7.1.1 c JavaEE 6 спецификацией.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@WebService(serviceName="Hellow")
@WebServlet(name="Hellow", urlPatterns={"/Hellow"})
public class HellowServiceImpl {
  @EJB private DocumentManager manager // @Stateless

  @WebMethod
  public void createDocument(byte[][] xmlList) throws HellowException {
     for(byte[] xml : xmlList)
         manager.createDocument(xml);
  }
}


Метод принимает массив бинарных данных. Должен создать столько же документов.
Вообще то рассчитываю на то, что ошибка создания одного из документов не позволит создать предыдущие документы из списка.
Умом понимаю, что в данной ситуации ошибка создания второго документа не приведет к откату создания первого документа.
Только вот не задача. Ошибка при создании первого документа приводит к появлению части этого документа. Такое ощущение, что метод из stateless объекта работает вне транзакции.
Спасает только применение
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Resource private UserTransaction utx;

try {
  utx.begin();
  manager.createDocument(xml);
  utx.commit();
} catch(Exception e) {
  utx.rollback():
  throw new HellowException("ошибка", e);
}


Почему JBoss не оборачивает все public методы интерфейса stateless объекта в транзакции?
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38967415
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может нужен интерфейс для DocumentManager ? Чтобы прокси создать, да транзакцию стартануть?
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38967616
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, В проекте у меня стоит
Код: java
1.
2.
3.
4.
@Stateless
public class DocumentManagerImpl implements DocumentManager {
...
}


Специальных аннотаций управления транзакциями нет.
Согласно спецификации, первый реализуемый интерфейс будет интерфейсом EJB объекта.
Согласно этой же спецификации, Stateless объект, создаваемый в CMT, поддерживает транзакции.
По умолчанию, каждый метод интерфейса работает в транзакции REQUIRED, если не описано другого поведения для EJB компонента в контейнере.

По факту, я не вижу транзакции. Вот и пытаюсь узнать, где пробел в моих знаниях.
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38967649
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
galsСпециальных аннотаций управления транзакциями нет.
Согласно спецификации, первый реализуемый интерфейс будет интерфейсом EJB объекта.
Согласно этой же спецификации, Stateless объект, создаваемый в CMT, поддерживает транзакции.
По умолчанию, каждый метод интерфейса работает в транзакции REQUIRED, если не описано другого поведения для EJB компонента в контейнере.

По факту, я не вижу транзакции. Вот и пытаюсь узнать, где пробел в моих знаниях.
Ну, логика верная. Противоречий не вижу. Вероятно стоит логирование сконфигурировать в дебаг и посмотреть.
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38967795
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, что даст настройка журнала? Я по стеку ошибки, в журнале, и так вижу, что нет обработчиков jboss чего-то там Tx.
По этому и возник вопрос,
Почему JBoss не оборачивает все public методы интерфейса stateless объекта в транзакции?
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38968185
mozheyko_d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gals,

Веб-сервис и EJB в одном приложении?
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38968662
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mozheyko_d, да, это единое ear приложение с несколькими war (фронт, админ, web services) и несколько ejb (jar) контейнеров. Проект собирается с помощью maven.
Так сказать, всё по взрослому.
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38968776
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
galsВообще то рассчитываю на то, что ошибка создания одного из документов не позволит создать предыдущие документы из списка.
Умом понимаю, что в данной ситуации ошибка создания второго документа не приведет к откату создания первого документа.
Только вот не задача. Ошибка при создании первого документа приводит к появлению части этого документа. Такое ощущение, что метод из stateless объекта работает вне транзакции.У Вас транзакция начинается и заканчивается на методе DocumentManager.createDocument(String), поэтому и не откатывается первый документ.

Кроме того, в EJB вводится все исключения делятся на application и system. Первые не откатывают транзакцию, вторые - наоборот. Читаем , там немного. И здесь будет полезно посмотреть.

автор
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Resource private UserTransaction utx;

try {
  utx.begin();
  manager.createDocument(xml);
  utx.commit();
} catch(Exception e) {
  utx.rollback():
  throw new HellowException("ошибка", e);
}

Вы не показали класс DocumentManager, но вообще такое работать не должно по умолчанию, при CMT запрещено обращаться к UserTransaction. Что Вы еще наворотили кроме сочетания аннотаций @WebService и @WebServlet?..
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38968778
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
BlazkowiczМожет нужен интерфейс для DocumentManager ? Чтобы прокси создать, да транзакцию стартануть?В Java EE 6, а если быть точным в EJB 3.1, поддерживается no-interface view. Интерфейс необязателен.
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38968873
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WGAУ Вас транзакция начинается и заканчивается на методе DocumentManager.createDocument(String), поэтому и не откатывается первый документ.
Слона-то я и не приметил.
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38969264
gals
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WGA, за подсказку, спасибо.
If a system exception occurs within a transaction, the EJB container rolls back the transaction. However, if an application exception is thrown within a transaction, the container does not roll back the transaction.


WGAЧто Вы еще наворотили кроме сочетания аннотаций @WebService и @WebServlet?

Согласен, что не красиво. Подскажите, как правильно сделать.
Описание веб сервиса:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
@Policies({
  @Policy(uri = "policies/policy.xml")
})
@WebService
@GZIP
public interface HellowService {
  @WebMethod
  public void createDocument(
    @WebParam("xmlList") byte[][] xmlList) throws HellowException;
  ...
}

@WebService(
  wsdlLocation = "wsdl/HellowService.wsdl",
  endpointInterface = "foo.HellowService",
  serviceName = "Hellow")
@EndpointProperties({
  @EndpointProperty(key = "ws-security.validate.token", value = "false")
})
@WebServlet(name="Hellow", urlPatterns={"/Hellow"})
public class HellowServiceImpl implements HellowService {
  @Resource private WebServiceContext wsCtx;
  ...
}


JBoss 7.1.1 показывает wsdl, но в wsCtx авторизация не заполнена. Приходится руками подправлять отдаваемую WSDL. Потом, говорить, бери ее как ресурс модуля.
WildFly 8.2 показывает wsdl правильно и в wsCtx есть параметры авторизации. Параметр wsdlLocation можно не указывать.

При наличии аннотации WebServlet, я описываю модуль сервсов как war модуль. Как результат, имею красивый адрес сервиса
http://localhost:8080/app_services/Hellow?wsdl

Заменяю WebServlet на Stateless. Модуль описываю как ejb. В результате адрес сервиса не красивый
http://localhost:8080/ear_app-x.y.z-SNAPSHOT/ejb_modelue/Hellow/HellowServiceImpl?wsdl

Получаю полный шлак. Присутствует номер текущего релиза или тестовой сборки приложения, название встроенного модуля,
интерфейс и реализация.
...
Рейтинг: 0 / 0
JTA Транзакции в EJB приложении
    #38969767
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
galsПри наличии аннотации WebServlet, я описываю модуль сервсов как war модуль. Как результат, имею красивый адрес сервиса
http://localhost:8080/app_services/Hellow?wsdl Так оно работает, оказывается... Никогда так не делал и не видел, но надо попробовать.

Похоже Ваша проблема JBoss-specific, так что помогу вряд ли. Я обычно веб-сервис определяю в WAR-модуле, без @Stateless, без "взрослых" EAR ) Тогда путь к сервису будет /<context-root>/<serviceName>, где serviceName из @WebService, так что получаются pretty URL. Хотя не уверен, верно ли это для JBoss, там CXF.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JTA Транзакции в EJB приложении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]