码迷,mamicode.com
首页 > 编程语言 > 详细

java rmi from SE343 SJTU

时间:2020-01-14 16:30:26      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:reference   cti   count   cts   返回   interface   war   ima   imp   

    这是SJTU SE343 Architecture of Enterprise Applications 第二讲的预习

  所有分布式编程中的基本想法背后都是一个简单的模型:client-server model。

  但是要怎么去实现client-server model使得client只需要像简单调用一个自己的函数一样调用server的函数?从而使得client,server在不同虚拟机上运行,减少fate sharing,增强模块化的同时,不用考虑网络转发与数据包解析等操作呢?

  老师的ppt中举出了三种方法:JAVA RMI、Common Object Request Broker Architecture(CORBA)、the web services architecture。

  这篇文章想要介绍的就是JAVA RMI。主要根据课程ppt来描述,分为三个部分:java rmi model,two ways to transfer parameters and return values,remote object activation.

  首先时一个基本的java rmi操作的流程图:

技术图片

  从图中可以看出: rmi的client与server(warehouseImpl)只负责发出请求与处理功能逻辑。stubs and parameter marshalling由其他类来做。这中间最关键的就是RMI registry。它负责创建一个远程对象,并将远程对象注册到RMI注册服务器上,并为之命名。而stub负责将client的函数调用转化成一个具有remote object identifier、remote method description、parameters的block。而Receiver一直运行,等待接受stub请求调用warehouseImpl的函数。

  在学习java rmi的时候,我不由得将java rmi与cse lab用到的rpc进行比较。在写cse lab时,server中会将需要被远程调用的函数进行注册,然后一直运行等待被调用。而client通过rpc来调用函数,并将所要调用的函数,所要传递的参数,所要收到的返回值均作为参数传入:示例代码如下:

extent_server(注册):

demo_server ds;  
    rpcs server(atoi(argv[1]), count);
    server.reg(demo_protocol::stat, &ds, &demo_server::stat);
  //long loop
while(1) sleep(1000);

 

extent_client(调用):

extent_client::extent_client(std::string dst)
{
  sockaddr_in dstsock;
  make_sockaddr(dst.c_str(), &dstsock);
  cl = new rpcc(dstsock);
  if (cl->bind() != 0) {
    printf("extent_client: bind failed\n");
  }
}

// a demo to show how to use RPC
extent_protocol::status
extent_client::create(uint32_t type, extent_protocol::extentid_t &id)
{
  extent_protocol::status ret = extent_protocol::OK;
  // Your lab2 part1 code goes here
  ret=cl->call(extent_protocol::create,type,id);
  return ret;
}

 

  在rpc中,函数名与返回值均以参数形式传递,而真正的参数限制在6个以下。rmi则不一样:

  JAVA RMI提供了两种传递值(参数与返回值)的途径:

    – Objects of classes that implement the Remote interface are transferred as remote references.

    – Objects of classes that implement the Serializable interface but not the Remote interface are copied using serialization.

    也就是继承自REMOTE的类中的值是引用其他虚拟机上的。而继承自serializable的类中的值是copy到本地的。

  下面讲述rmi中的 activation mechanism:

    delay the object construction so that a remote object is only constructed when at least one client invokes a remote method on it.

    这个实在warehouseImpl的构造函数中实现的,通过添加一个activation ID作为第一个参数。其他更多具体的实现希望上完这堂课后补充。

 

java rmi from SE343 SJTU

标签:reference   cti   count   cts   返回   interface   war   ima   imp   

原文地址:https://www.cnblogs.com/Gzxjt/p/12192264.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!