JFox(J2EE应用服务器开源项目)

Last Modified: 2003.12.02

JFox使用的传输协议


JFox使用了协议后决的调用方式,在获得EJB Home的时候,并没有给接下来的调用绑定协议,知道进行EJB组件方法调用的时候, 才绑定一个确切的协议,JFox暂时只支持JRMP 和 Local 两种协议,更多的协议如:SOAP HTTP IIOP等将在后来的版本中发布。

默认情况下,远程客户调用应用服务器中的EJB组件,将使用JRMP协议,而同一个应用服务器中间的EJB之间的调用, 将使用之间的Java调用方式(LOCAL调用),提高执行速度。
但是在某些特定的情况下,比如希望EJB之间的调用也采用JRMP进行远程调用(虽然这种情况很少),这个时候, 就需要强行转换调用协议,jfox提供了强行转换调用协议的接口。看下面的例子, 完整的代码见:org.jfox.ejb.examples.protocol.HelloBean

	  public String getWordByLocal() throws RemoteException {
    try {
      Context ctx = new InitialContext();
      Object obj = ctx.lookup("" + WorldHome.class.getName().replace('.','/'));
      WorldHome home = (WorldHome)javax.rmi.PortableRemoteObject.narrow(obj,WorldHome.class);
      // 可以省略,ejb 之间的调用默认将采用 Local 协议调用
((ExtendedEJBHome)home).useProtocol("LOCAL"); 
      World world = home.create();
      return world.getWord();
    }
    catch(Exception e){
      throw new RemoteException(e.getMessage(),e);
    }
  }

  public String getWordByJRMP() throws RemoteException {
    try {
      Context ctx = new InitialContext();
      Object obj = ctx.lookup("" + WorldHome.class.getName().replace('.','/'));
      WorldHome home = (WorldHome)javax.rmi.PortableRemoteObject.narrow(obj,WorldHome.class);
      ((ExtendedEJBHome)home).useProtocol("JRMP");  // EJB 之间的调用强行使用 JRMP 协议
      World world = home.create();
      return world.getWord();
    }
    catch(Exception e){
      throw new RemoteException(e.getMessage(),e);
    }
  }


现在ExtendedEJBHome.useProtocol() 的有效参数只有 JRMP 和 LOCAL,协议不区分大小写。

因为jfox已经自动选择了最佳的调用协议,且强行转换调用协议超出了EJB规范的内容, 所以我们希望您一般情况下不要这样做。