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

Имеется 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
24.05.2015, 22:13
    #38967415
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTA Транзакции в EJB приложении
Может нужен интерфейс для DocumentManager ? Чтобы прокси создать, да транзакцию стартануть?
...
Рейтинг: 0 / 0
25.05.2015, 11:08
    #38967616
gals
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTA Транзакции в EJB приложении
Blazkowicz, В проекте у меня стоит
Код: java
1.
2.
3.
4.
@Stateless
public class DocumentManagerImpl implements DocumentManager {
...
}


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

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

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

Веб-сервис и EJB в одном приложении?
...
Рейтинг: 0 / 0
26.05.2015, 13:47
    #38968662
gals
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTA Транзакции в EJB приложении
mozheyko_d, да, это единое ear приложение с несколькими war (фронт, админ, web services) и несколько ejb (jar) контейнеров. Проект собирается с помощью maven.
Так сказать, всё по взрослому.
...
Рейтинг: 0 / 0
26.05.2015, 14:54
    #38968776
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTA Транзакции в EJB приложении
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
26.05.2015, 14:57
    #38968778
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTA Транзакции в EJB приложении
BlazkowiczМожет нужен интерфейс для DocumentManager ? Чтобы прокси создать, да транзакцию стартануть?В Java EE 6, а если быть точным в EJB 3.1, поддерживается no-interface view. Интерфейс необязателен.
...
Рейтинг: 0 / 0
26.05.2015, 15:46
    #38968873
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTA Транзакции в EJB приложении
WGAУ Вас транзакция начинается и заканчивается на методе DocumentManager.createDocument(String), поэтому и не откатывается первый документ.
Слона-то я и не приметил.
...
Рейтинг: 0 / 0
26.05.2015, 22:17
    #38969264
gals
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTA Транзакции в EJB приложении
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
27.05.2015, 13:50
    #38969767
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JTA Транзакции в EJB приложении
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
Форумы / Java [игнор отключен] [закрыт для гостей] / JTA Транзакции в EJB приложении / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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