java rmi from SE343 SJTU
Posted 潜力无限*start
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java rmi from SE343 SJTU相关的知识,希望对你有一定的参考价值。
这是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的主要内容,如果未能解决你的问题,请参考以下文章
Java SE 8 TemporalAccessor.from 与 java.time.Instant 对象一起使用时出现问题