8. Activation
通过调用UnicastRemoteObject.exportObject()方法发布的远程对象的生命周期是从发布起,一直到所在应用停止为止。RMI的activation机制允许在rmid中发布可激活的激活描述符,只有当客户端发起远程调用时才真正构造远程对象。
8.1 MyRemote类
public interface MyRemote extends Remote{
public Product getProduct(int productId) throws RemoteException;
}
8.2 Product实现了Serializable
public class Product implements Serializable{
private static final long serialVersionUID = 5206082551028038485L;
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toSring(){
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
.append("id")
.append("name")
.toString();
}
}
8.3 RmiUtil工具类
public abstract class RmiUtil {
public static int getRegistryPort(){
return Registry.REGISTRY_PORT;
}
public static Registry getRegistry() throws Exception{
return getRegistry(Registry.REGISTRY_PORT);
}
public static Registry getRegistry(int port) throws Exception{
Registry reg = LocateRegistry.getRegistry(port);
reg.list();
return reg;
}
public static Registry getRegistry(String host) throws Exception{
return LocateRegistry.getRegistry(host, Registry.REGISTRY_PORT);
}
public static Registry getRegistry(String host, int port) throws Exception{
return LocateRegistry.getRegistry(host, port);
}
}
8.4 MyRemoteImpl实现类
public class MyRemoteImpl implements MyRemote{
@Override
public Product getProduct(int productId) throws RemoteException {
final Product product = new Product();
product.setId(productId);
product.setName("xiao");
return product;
}
public static void main(String[] args) throws Exception{
MyRemoteImpl remote = new MyRemoteImpl();
MyRemote myRemote = (MyRemote)UnicastRemoteObject.exportObject(remote, 0);
Registry reg = RmiUtil.getRegistry();
reg.bind("MyRemote", myRemote);
System.out.println("server started");
}
}
8.5 Client客户端
public class Client {
public static void main(String[] args) throws Exception {
Registry reg = RmiUtil.getRegistry();
MyRemote remote = (MyRemote)reg.lookup("MyRemote");
System.out.println(" name = " + remote.getProduct(1).getName());
}
}
9. 垃圾回收
RMI采用其分布式垃圾回收功能收集不再被网络中任何客户程序所引用的远程服务对象。当前的分布式垃圾回收采用的是引用计数的方式(类似于Modula-3's Network Objects),因此无法检测到循环引用的情况,这要求程序员打破循环引用,以便无用的对象可以被回收。RMI运行时通过WeakReference引用远程对象,当某个远程对象不再被任何客户端引用时,JVM会对其进行垃圾回收。
分享到:
相关推荐
java rmi java rmijava rmi javajava rmi java rmi rmi
java RMI技术实现的网络聊天室 编译通过,很完整的。代码很有参考价值
采用JAVA rmi,带图形界面,完全由自己实现的聊天室,具备基本的聊天功能,可以自己扩充功能
检测javaRMI反序列化漏洞
java RMI
java RMI实现代码。分为客户端和服务器端,有清楚的代码注释。
Java RMI 简单示例
在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sockets两种之间,其中RMI的灵活性不高,客户端和服务器端都必须是java编写,但使用比较方便,...
JavaRMI.pdf
最近在学习代理模式,用到了java rmi远程调用,包含服务端和客户端,之前一直没有接触过,学习了java rmi远程调用,一方面可以了解代理模式,一方面熟悉java低层的远程
《Java RMI》一书的英文版本,With Java RMI, you'll learn tips and tricks for making your RMI code excel. This book provides strategies for working with serialization, threading, the RMI registry, ...
Java编程rmi实例,给出远程方法调用技术在java方面的具体例子。
javaRMI完整版.pdf
Java RMI的应用——学习RMI的简单编程应用。编写一个课程成绩管理程序,要求用Java RMI实现
Java RMI实例
这是本人搜集整理的Java RMI规范,中文版,经过排版 共包括10个章节,2个附录
我的博客《Java中的RMI(远程方法调用)》的示例代码
这是原创的最简单的Java RMI入门项目,内含二个Eclipse项目,一是服务器端,二是客户端。非常简单,只看其中的注释就能理解(当然先要知道什么是RMI了),只供入门用。 这是用Java 1.7编辑的,如果你用的版本低,则...
java 有关rmi进行分布式学习的参考文档
JAVARMI实例[文].pdf