Главная » Java, JavaBeans » Управление исключениями EJB

0

Если в процессе транзакции возникла ошибка, Компонент EJB может возбуждать как системные, так и свои собственные исключительные ситуации. Исключения, специфические для Приложения, говорят об

ошибках, связанных с бизнес-логикой и предназначены для обработки вызывающим приложением. Системные исключения, такие, как ошибки времени выполнения, имеют более общий характер и могут быть обработаны как приложением, так и Компонентом или Контейнером Компонента.

Компонент EJB объявляет возможные исключения обоих уровней в throws-списке методов интерфейсов home и remote. Вы должны перехватывать и обрабатывать эти исключения в блоках try/catch в вашей программе при вызове методов Компонента.

Системные исключения

Компонент возбуждает исключительные ситуации

java.ejb.EJBException (или java.rmi.RemoteException) для сигнализации о неожиданном сбое на системном уровне. Например, такое исключение возбуждается, если невозможно установить соединение с базой данных. Исключение java.ejb.EJBException является runtime-исключением и не обязано присутствовать в throws-списке бизнес-метода Компонента.

Системные исключения обычно подразумевают необходимость выполнения отката транзакции. Как правило, это выполняет Контейнер. В других случаях, особенно при использовании ВМТ, откат транзакции должен быть выполнен клиентом.

Исключения, специфические для приложения

Такие исключения возбуждаются при возникновении ошибки, специфической для приложения – другими словами, вследствие ошибок бизнес-логики, а не возникновения системных проблем. Такими исключениями являются исключения, отличные от исключения java.ejb.EJBException. Эти исключения являются проверяемыми исключениями, что означает, что вы обязаны проверить их наличие при вызове метода, который потенциально способен их возбудить.

Бизнес-методы Компонента возбуждают исключения уровня приложения для сигнализации о возникновении таких условий, как недопустимое входное значение или значение вне допустимого диапазона. Например, метод, который списывает средства со счета, может возбудить такое исключение, чтобы показать, что состояние счета не позволяет выполнить такую операцию. Во многих случаях клиент обрабатывает такие ошибки без выполнения отката целой транзакции.

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

Обработка исключений приложения

Вследствие того, что исключения уровня приложения говорят об ошибке в логике программы, предполагается, что вы как клиент занимаетесь их обработкой. Хотя возникновение исключений может потребовать отката транзакции, это не выполняется автоматически. Вы часто имеете возможность исправить ситуацию, хотя иногда необходимо откатить и завершить транзакцию.

Разработчик Компонента обязан гарантировать, что в случае продолжения транзакции клиентом не происходит разрушения целостности данных. Если Разработчик не может гарантировать этого, тогда Компонент помечает транзакцию как предназначенную для отката после ее завершения.

Откаттранзакции

Когда клиент получает извещение о возникновении исключительной ситуации, в первую очередь ему следует проверить, не помечена ли текущая транзакция как "rollback only". Например, клиент может получить исключение j avax. transaction. TransactionRolledbackException.

Это говорит о том, что произошла ошибка в вспомогательном классе Компонента и транзакция завершена или помечена как "rollback only".

В общем случае клиент не знает значение контекста транзакции, который сопоставлен с Компонентом. Вызываемый Компонент может выполняться в своем собственном контексте транзакции, отличающемся от контекста транзакции вызывающего приложения, или он может выполняться в том же контексте транзакции.

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

j avax.transaction.TransactionRolledbackException. Напоминаем, что декларативный стиль управления транзакциями подразумевает, что управление всеми аспектами берет на себя Контейнер.

Клиент, который представляет собой Компонент EJB, может вызвать метод javax.ejb.EJBContext.getRollBackOnly() для определения, помечена ли транзакция для отката или нет.

При использовании режима ВМТ – то есть транзакций, явно управляемых клиентом – клиенту следует откатить транзакцию с помощью вызова метода rollback интерфейса java.transaction.UserTransaction.

Возможности для продолжения транзакции

Когда транзакция не помечена как "rollback only", клиент имеет следующие три возможности:

•                 Откатить транзакцию.

•          Передать обработку этого события дальше, возбудив новое исключение или повторно возбудив то же самое исключение.

•          Внести изменения и продолжить выполнение транзакции. Это может подразумевать повторное выполнение части кода транзакции.

Когда клиент получает исключение для транзакции, не помеченной для отката, наиболее безопасным решением будет откатить транзакцию. Для этого клиент либо помечает транзакцию как "rollback only", либо, если он сам начал эту транзакцию, выполняет явный ее откат с помощью вызова метода rollback ().

Клиент также может возбудить свою собственную исключительную ситуацию или повторно возбудить первоначальное исключение. В любом случае, клиент откладывает вопрос принятия решения, как поступить с данной транзакцией. Тем не менее, в общем случае предпочтительным является вариант, когда решение принимается как можно раньше.

Наконец, клиент может продолжить выполнение транзакции. Он может проанализировать полученное исключение и решить, стоит ли вызвать тот же метод повторно с другими аргументами. При этом следует всегда иметь в виду, что такая повторная попытка является потенциально опасной. Вы не имеете достаточно информации или гарантий того, что Компонент EJB способен правильно работать в таком режиме.

Тем не менее, клиент, который обращается к stateless session-Компоненту, может повторно вызвать тот же метод с гораздо меньшими опасениями (конечно, если он определил причину возникновения исключительной ситуации). Это связано с тем, что Компонент не имеет состояния, и проблема некорректного состояния Компонента просто не возникает.

Источник: Руководство программиста Enterprise JavaBeans

По теме:

  • Комментарии