当EJB客户端失去与Application Server的连接时,是否存在可以捕获的异常?

Lui*_*iro 3 java openejb ejb-3.1

我想为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;

}
Run Code Online (Sandbox Code Playgroud)

当然EJBConnectionException不存在.有什么类似的吗?

我们正在使用OpenEJB 1.4(符合EJB 3.x).但是,我们希望使用可以在不同应用程序服务器上使用的异常处理程序(如果可能).

另一件事是某些应用程序服务器提供某种故障转移机制,但我们的要求有点具体,我们可以直接在客户端代码中实现它.

Dav*_*ins 7

@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() {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,bean本身不需要RemoteException在throws子句中声明.Java允许您在实现接口时声明异常的子集,而EJB不会更改它.从bean本身抛出RemoteException会打败整个点,因此将其遗漏是一个好主意.