有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当EJB客户端失去与应用服务器的连接时,是否存在可以捕获的异常?

我想为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(EJB3.x兼容)。然而,如果可能的话,我们希望使用一个可以跨不同应用服务器使用的异常处理程序

另一件事是,一些应用服务器提供了某种故障转移机制,但我们的需求有点特定,我们可以直接在客户机代码中实现它


共 (1) 个答案

  1. # 1 楼答案

    同样实现@Remotejava.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() {
            //...
        }
    }
    

    注意,bean本身不需要在throws子句中声明RemoteException。Java允许您在实现接口时声明异常的子集,而EJB不会改变这一点。从bean本身抛出RemoteException将破坏整个要点,因此将其忽略是一个好主意