Есть ли исключение, которое может быть зафиксировано, когда клиент EJB теряет соединение с сервером приложений? - PullRequest
3 голосов
/ 02 июня 2011

Я хотел бы создать обработчик исключений для конкретного случая, который происходит, когда клиентское приложение EJB теряет соединение с сервером приложений. Код, который мы создаем, способен обработать клиентское приложение удобным для пользователя способом, чтобы попытаться повторно подключиться к тому же серверу или другому серверу в среде аварийного переключения. Под «потерей связи» я имею в виду все, что требует повторного подключения. Причиной может быть проблема сети, блокировка сервера, отключение сервиса и т. Д.

Вот идея того, что мы ищем (код клиента):

private void doSomething() throws RecoverableException {
//(...)
BusinessRemoteEJB ejb=ctx.lookup("BusinessRemoteEJB");

try {
    List<product> list=ejb.getProducts();
    //(...)
} catch (EJBException e){
 Exception e = e.getCausedByException();

 //Here is what I'm looking for: some excpetion that indicates a connection problem
 if(e !=null && e instanceof EJBConnectionException){

     //This will be catched in a proper place to try to reconnect
     throw new RecoverableException(e);
 } else {
 //If it is any other excpetion, just let it work up the stack
 throw e;

}

Конечно EJBConnectionException не существует. Есть что-нибудь подобное?

Мы используем OpenEJB 1.4 (совместим с EJB 3.x). Однако мы хотим использовать обработчик исключений, который можно использовать на разных серверах приложений, если это возможно.

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

1 Ответ

7 голосов
/ 02 июня 2011

Интерфейс @Remote, который также реализует java.rmi.Remote, будет немного изменен в обработке исключений.А именно, каждый метод в интерфейсе должен будет объявить java.rmi.RemoteException.Это позволит клиенту получать проблемы с подключением.При отсутствии java.rmi.Remote контейнер преобразует все такие проблемы в EJBException.Не существует никаких требований, кроме того, что это EJBException, поэтому полагаться на причину или любой подкласс EJBException непереносимо.

@Remote
public interface OrangeRemote extends java.rmi.Remote {

    public void doSomething() throws RemoteException;
}

@Stateless
public class OrangeBean implements OrangeRemote {

    @Override
    public void doSomething() {
        //...
    }
}

Обратите внимание, что сам бин не обязан объявлять RemoteException в броскахпункт.Java позволяет вам объявлять подмножество исключений при реализации интерфейса, и EJB не меняет это.Исключение RemoteException из самого bean-компонента уничтожило бы весь смысл, поэтому упустить его - хорошая идея.

...