【问题标题】:Is there an Exception that can be captured when an EJB client loses the connection to the Application Server?当 EJB 客户端失去与应用程序服务器的连接时,是否可以捕获异常?
【发布时间】:2011-06-02 17:17:13
【问题描述】:

我想为 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)。但是,如果可能,我们希望使用可以跨不同应用服务器使用的异常处理程序。

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

【问题讨论】:

    标签: java ejb-3.1 openejb


    【解决方案1】:

    同样实现java.rmi.Remote@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 会破坏整个问题,因此将其排除在外是个好主意。

    【讨论】:

    • 我是否仍然会收到 EJBExceptions 并且只有网络问题会引发 RemoteException?还是 RemoteExcpetion 封装了所有的异常?
    • 对于与通过网络移动数据无关的任何事情,您仍然会收到 EJBException。请注意,RemoteException 涵盖了所有“移动数据”问题,例如可能无法序列化的发送对象。在那种情况下,客户端、服务器和连接都可以正常工作。
    • 不幸的是,我们似乎将 SystemException(运行时异常)包裹在 RemoteException 周围。它应该被包装在 EJBException 上,不是吗?
    猜你喜欢
    • 2015-05-21
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    相关资源
    最近更新 更多