EJB3 - обработка RollBackExceptions - PullRequest
0 голосов
/ 23 марта 2009

У меня есть приложение EJB3, которое состоит из нескольких EJB для доступа к БД и предоставляется через Session Bean в качестве веб-службы.

Теперь есть две вещи, которые мне нужно выяснить:

1) Можно ли каким-то образом предотвратить исключения SQL из-за того, что веб-служба выдает ошибку SOAP? Транзакции обрабатываются контейнером, и в настоящее время исключения sql вызывают исключение RollBackException и, как следствие, откат транзакции (желаемое поведение) и веб-службу, которая выдает ошибку (не желательно).

2) Я хочу расширить веб-сервис, чтобы иметь возможность принимать список объектов и сессионный компонент для сохранения каждого из них. Тем не менее, я хочу, чтобы каждая сущность выполнялась в своей собственной транзакции, чтобы в случае сбоя одного из них другие не были затронуты (и снова веб-служба не должна отказывать).

Для (1) я пытался поймать исключение RollBackException, но я предполагаю, что оно генерируется где-то в другом потоке, так как блок catch никогда не достигается. Я предполагаю, что для (2) мне потребуется изучить транзакции пользователя, но, во-первых, я бы предпочел, чтобы контейнер управлял этим, а во-вторых, не знаю, как форсировать использование транзакций пользователя.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 23 марта 2009

нет, вы можете делать все это с помощью транзакций, управляемых контейнером (и это определенно предпочтительнее, так как управление транзакциями - это боль).

Суть решения заключается в создании второго EJB-компонента только с локальным интерфейсом и семантикой транзакции, которую вы желаете. затем ваш "публичный" ejb, к которому веб-служба обращается напрямую, обращается к этому второму ejb через локальный интерфейс для выполнения реальной работы.

что-то вроде:

public class MyPublicEjb {
  @EJB
  private MyPrivateImpl impl;

  public void doSomething() {
    try {
      impl.doSomething();
    } catch(TXRolledBack) {
      // handle rollback ...
    }
  }
}

Я знаю, это выглядит некрасиво, но поверьте мне, это гораздо предпочтительнее, чем прямое манипулирование транзакциями.

0 голосов
/ 23 марта 2009

Для (1): отладьте ваш код, чтобы выяснить, где генерируется исключение и что его вызывает. Затем обработайте исключение там.

Для (2): Оберните каждый экземпляр функциями beginTransaction () и commit ().

for(each Entity){
    try{
        //begin transaction
        //save entity
        //commit
    } catch(Exception e) {
         //handle Exception, but continue on
    }
}
...