分布式-远程部署的RMI
2016-07-07 09:55
357 查看
参考HeadFirst java 看分布式,环境win 7
接口代码如下:
服务实现类:
客户端实现类:
命令行:
当前目录下开一个命令行:
javac *.java
rmic -vcompat MyRemoteImpl
rmiregistry
当前目录下开新的命令行:
java MyRemoteImpl
当前目录下开新的命令行:
java MyRemoteClient
使用RMI 时常犯的错误:
1.忘记在启动远程服务前启动rmiregistry(使用Naming.rebind()注册服务前rmiregistry必须启动)
2.忘记把参数和返回类型做成可序列化。
3.忘记将stub类交给客户端。
客户端和服务端分别需要哪些:
客户端:
别忘记客户端是使用接口来调用stub上的方法,客户端的java 虚拟机必须要有stub类,但客户端不会在程序代码中引用到stub类,客户端总是通过接口来操作真正的远程对象。
1.client.class
2.MyRemoteImpl_Stub.class
3.MyRemote.class
服务端:
服务器上必须要有stub和skeleton,以及服务器与远程的接口,它会需要stub类是因为stub会被代换成链接在RMIregistry上真正的服务。
1.MyRemote.class
2.MyRemoteImpl.class
3.MyRemoteImpl_Stub.class
4.MyRemoteImpl_Skel.class
要点:
在某堆上的对象无法进行另外堆上的对象引用。
Java Remote Method Invocation (RMI)让你感觉上像是调用远程调用对象的方法,但其实不是。
当客户端调用远程对象的方法时,其实是调用代理上的方法,此代理被称为stub。
stub是格处理低层网络细节的辅助性对象,它会把方法的调用包装起来送到服务器上。
要创建远程服务的话,你就必须要以远程接口来启动。
远程接口必须要extend过java.rmi.Remote这个接口,且所有的方法都必须声明RemoteException。
你的远程服务会实现远程接口。
远程服务应该要继承UnicastRemoteObject(技术上也有其他方法可以创建远程对象,但这是最简单的方式)。
远程服务必须要声明RemoteExcption的构造函数(因为父类的构造函数声明了)。
远程服务的对象必须要向RMI registry注册。
使用静态的Naming.rebind()来注册远程服务。
RMI registry 必须在同一台机器上与远程服务一块执行,且必须在对象的注册之前启动。
客户端会以Naming.lookup()查询远程服务。
几乎所有与RMI有关的都会抛出RemoteException(由编译器检查)。
接口代码如下:
import java.rmi.Remote; import java.rmi.RemoteException; public interface MyRemote extends Remote{ public String sayHello()throws RemoteException; }
服务实现类:
import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{ public MyRemoteImpl() throws RemoteException { } private static final long serialVersionUID = 2430212474440437524L; public String sayHello() { return "Server says,'Hey'"; } public static void main(String[] args) { try { MyRemote service =new MyRemoteImpl(); Naming.rebind("Remote", service); } catch (Exception e) { e.printStackTrace(); } } }
客户端实现类:
import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class MyRemoteClient { public static void main(String[] args) { new MyRemoteClient().go(); } public void go(){ try{ MyRemote service=(MyRemote) Naming.lookup("rmi://127.0.0.1/Remote"); String s=service.sayHello(); System.out.println(s); }catch (Exception e) { e.printStackTrace(); } } }
命令行:
当前目录下开一个命令行:
javac *.java
rmic -vcompat MyRemoteImpl
rmiregistry
当前目录下开新的命令行:
java MyRemoteImpl
当前目录下开新的命令行:
java MyRemoteClient
使用RMI 时常犯的错误:
1.忘记在启动远程服务前启动rmiregistry(使用Naming.rebind()注册服务前rmiregistry必须启动)
2.忘记把参数和返回类型做成可序列化。
3.忘记将stub类交给客户端。
客户端和服务端分别需要哪些:
客户端:
别忘记客户端是使用接口来调用stub上的方法,客户端的java 虚拟机必须要有stub类,但客户端不会在程序代码中引用到stub类,客户端总是通过接口来操作真正的远程对象。
1.client.class
2.MyRemoteImpl_Stub.class
3.MyRemote.class
服务端:
服务器上必须要有stub和skeleton,以及服务器与远程的接口,它会需要stub类是因为stub会被代换成链接在RMIregistry上真正的服务。
1.MyRemote.class
2.MyRemoteImpl.class
3.MyRemoteImpl_Stub.class
4.MyRemoteImpl_Skel.class
要点:
在某堆上的对象无法进行另外堆上的对象引用。
Java Remote Method Invocation (RMI)让你感觉上像是调用远程调用对象的方法,但其实不是。
当客户端调用远程对象的方法时,其实是调用代理上的方法,此代理被称为stub。
stub是格处理低层网络细节的辅助性对象,它会把方法的调用包装起来送到服务器上。
要创建远程服务的话,你就必须要以远程接口来启动。
远程接口必须要extend过java.rmi.Remote这个接口,且所有的方法都必须声明RemoteException。
你的远程服务会实现远程接口。
远程服务应该要继承UnicastRemoteObject(技术上也有其他方法可以创建远程对象,但这是最简单的方式)。
远程服务必须要声明RemoteExcption的构造函数(因为父类的构造函数声明了)。
远程服务的对象必须要向RMI registry注册。
使用静态的Naming.rebind()来注册远程服务。
RMI registry 必须在同一台机器上与远程服务一块执行,且必须在对象的注册之前启动。
客户端会以Naming.lookup()查询远程服务。
几乎所有与RMI有关的都会抛出RemoteException(由编译器检查)。
相关文章推荐
- Java RMI介绍
- 分布式版本管理git入门指南使用资料汇总及文章推荐
- C#分布式事务的超时处理实例分析
- Erlang分布式节点中的注册进程使用实例
- Memcached 分布式缓存实现原理简介
- RMI使用学习 小结
- RPC、RMI、SOAP的区别详解
- C++实现的分布式游戏服务端引擎KBEngine详解
- ASP.NET通过分布式Session提升性能
- java使用rmi传输大文件示例分享
- Spring+Mybatis+Mysql搭建分布式数据库访问框架的方法
- Python使用multiprocessing实现一个最简单的分布式作业调度系统
- 分享一个简单易用的RPC开源项目—Tatala
- 手把手教你配置Hbase完全分布式环境
- 搭建分布式架构2--CentOs下安装Tomcat7(环境准备)
- 搭建分布式架构4--ZooKeeper注册中心安装
- 分布式任务调度平台XXL-JOB
- Glusterfs:趋于成熟的集群文件系统
- 关于glusterfs的directory-layout-spread参数