服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

candle点亮你的web应用(candlermi)


  introduction
  candlermi是java远程方法调用(remote method invocation)的实现,与sun rmi的实现方式不同,candlermi利用java本身的特性并结合http实现了简单高效的rmi功能。candlermi service 作为candle services的一部分,与candle server整合在一起。
  
  candlermi facilities
  
  •  不需要生成stub和skel文件
  •  通过文本的方式注册rmi,不需要单独的注册服务和在程序中实现绑定
  •  远程接口和实现不需要继承特殊的类或接口
  •  最小资源利用,开发和部署方便
  
  candlermi architecture
  candlermi体系结构图中最核心的是中间remote与service如何通讯。通讯内容通过http协议以时间顺序分别为:名字查询(lookup),返回远程对象(remote object),方法调用(method invoke)和方法返回(return)。上述四个通讯内容按照http通讯协议的标准封装在两个客户端请求中。
  
  rmi remote
  远程接口封装和定义远程方法。接口是公开的,隐藏了具体的实现部分。client只能使用接口,接口的设计必须符合规范,并且需要封装必须的远程方法。对于实际的应用来说,远程接口可能按照系统功能模块来分有许多个。一个简单的接口如下:
  
  package cn.candle.demo;
  
  import java.rmi.remoteexception;
  
  /**
   * @author zhouj
   *
   */
  interface compute {
    public string calculate(double d, string[] args) throws remoteexception;
  }
  
  远程接口看上去和一般的接口定义没有任何不同,但是远程方法需要抛出一个远程异常,并且方法参数和返回参数必须是可序列化的对象类。目前版本的candlermi并不能把prototype映射为相应的对象类,比如例子中的参数"double d",不能定义成"double d"。
  
  远程接口实现在server端利用server vm的资源为remote提供资源服务和运算。candlermi 体系结构图中,远程接口实现类对象需要传递,因此远程接口实现必须是可序列化的对象类。这些规则约束与sun rmi并没有多大不同,只不过是一个更简单的版本。理解规则以后,编码和运行才能避免常见错误。远程接口具体实现例子如下:
  
  package cn.candle.demo;
  
  import java.io.serializable;
  
  /**
   * @author zhouj
   * 
   */
  public class computeimpl implements compute, serializable {
  
    /*
     *
     * @see cn.candle.demo.compute#calculate
     */
    public string calculate(double d, string[] args) {
      double _d = math.sqrt(d.doublevalue());
      return "square root of " + d.doublevalue() + " is " + _d + " at "
          + args[1];
    }
  }
  
  invoke remote method
  远程接口和实现是开发的重点和核心部分,接下来如何使用远程接口并调用其中的远程方法呢?在sun rmi规范中有jndi naming来帮助查找远程服务;candlermi使用类似的规则查询远程接口对应的名称,不过远程接口实现都是在固定的server上,因此并不需要jndi命名规则。使用candlermi部署你的远程方法调用,开发包是candle0.76版本中的candle-rmi.jar。例子代码如下:
  
  package cn.candle.demo;
  
  import java.rmi.notboundexception;
  import java.rmi.remoteexception;
  
  import cn.candle.rmi.naming;
  
  /**
   * @author zhouj
   * 
   */
  public class testrmi {
  
    public static void main(string[] args) {
      compute compute = null;
      try {
        compute = (compute) naming.lookup("compute");
      } catch (remoteexception e) {
        // todo 自动生成 catch 块
        e.printstacktrace();
      } catch (notboundexception e) {
        // todo 自动生成 catch 块
        e.printstacktrace();
      }
      try {
        system.out.println(compute.calculate(new double(3), new string[] {
            "", "test" }));
      } catch (remoteexception e1) {
        // todo 自动生成 catch 块
        e1.printstacktrace();
      }
    }
  }
  
  rmi registry
  rmi注册是把远程接口和实现与自定义的名称关联起来。上述例子中远程接口cn.candle.demo.compute对应的名称是"compute",可以定义成任意不重复的名字。注意candlermi规则中远程服务名称是英文不区分大小写。candlermi注册是使用文本文件的方式,固定的文件名称和相对路径为web-app/rmi.registry。文件为普通的java 资源文本文件,格式如下:
  
  #candlermi registry
  compute=cn.candle.demo.computeimpl
  
  run candlermi example

扫描关注微信公众号