Обработка исключения TransactionTimeout в EJB - PullRequest
1 голос
/ 20 января 2012

У меня есть метод EJB с именем methodA (), вызывающий другой метод EJB с именем methodB (), который запускает новую транзакцию, управляемую контейнером. в methodB я принудительно устанавливаю тайм-аут транзакции, который правильно перехватывается catchB и не распространяется на methodA. Но я удивлен, что methodA получает исключение. Я что-то здесь упускаю?

methodA() {
 try {
   methodB();
   System.out.println("print me!");
 } catch(Exception e) {
   System.out.println("shouldn't be here");
 }
}

@TransactionTimeout(5) //5 sec timeout
methodB() {
  try {
    Thread.sleep(6000);
  } catch(Throwable t) {
    System.out.println("Eating all the Exception..");
  }
}

Первый метод никогда не должен был перехватывать исключение (EJBTransactionTimeoutException), потому что метод B его съел. Я вижу результат «Не должно быть здесь» вместо «напиши мне!». Это заставляет меня задуматься, генерирует ли контейнер еще одно исключение EJBTransactionTimeoutException сразу после завершения methodB, хотя он уже выдал исключение Timeout?

1 Ответ

5 голосов
/ 20 января 2012

Thread.sleep() никогда не выдает TransactionTimeoutException, поэтому этот блок перехвата не может перехватить это исключение.

Когда EJB A вызывает methodB из EJB B, он не вызывает метод bean напрямую.Он вызывает methodB на прокси.Этот прокси-сервер отвечает за управление транзакциями, безопасность и т. Д., А затем вызывает фактический метод B в экземпляре компонента.

Таким образом, исключение не выдается при использовании метода B.Он вызывается из прокси-сервера, который упаковывает EJB-компонент B и выдает исключение TransactionTimeoutException при возврате methodB экземпляра упакованного компонента, и для его выполнения потребовалось больше времени, чем настроено.

...