Registry registry = LocateRegistry.getRegistry();
registry.rebind(RemoteService.name, stub);

Java 平台支持两种方式来做分布式应用。IDL与RMI方式。IDL是基于CORBA规范的,能够用来调用非java写的语言应用。

IDL使用CORBA/IIOP协议,而RMI使用JRMP协议。

J2SE5的RMI的开发主要分7步:

1 定义远程接口

2 写server端代码

3 执行rmic

4 写client

5 注冊RMI

6 执行server

7 执行client

RMI的远程接口必须是 java.rmi.Remote的实现类。

并且client和server必须在同一个包下,全部的方法參数和返回值必须是基本类型或者实现了序列化接口的对象。异常不能乱抛,异常必须是RemoteException,或者它的子类。

RMIC已经过时了。

J2SE5的RMI我就不讲了。那个须要RMIC来生成一些东西,贼复杂。

尽管RMIC还保留在JDK的bin文件夹下,可是执行RMIC还是会出现警告的,RMIC过时了。

到了J2SE8,RMI开发就相当简单了:

我把步骤总结一下:

1 写服务接口

2 写远程服务实现类

3 写简单的server

4 写client

server接口非常easy。

public interface RemoteService extends Remote{

	String hello() throws RemoteException;
String name = "remoteService";
}

这个接口非常easy的,可是符合了RMI的规范。

首先实现了Remote的接口,其次方法返回值是string,string是能够序列化的,再次,抛出的异常是RemoteException异常。

实现类非常easy:

public class RemoteServiceBean implements RemoteService {

	public RemoteServiceBean() {
super();
} @Override
public String hello() throws RemoteException {
return "Hello world!";
}
}

最复杂的是server:

public class Server {
static int port = 2019;
public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
RemoteService remoteService = new RemoteServiceBean();
RemoteService stub = (RemoteService)UnicastRemoteObject.exportObject(remoteService,port);
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
Registry registry = LocateRegistry.getRegistry();
registry.rebind(RemoteService.name, stub);
System.out.println("Bounded!");
} }

这个server能够说,麻雀虽小。五脏俱全。

首先是获取接口的存根,也叫stub。

UnicastRemoteObject.exportObject方法就是获取存根的。

事实上是创建了一个代理对象,这个代理对象的实现就是调用远程的server方法。

其次启动注冊server。关于服务的注冊,我们之前可能是没有这个概念的。

注冊server感觉非常多余。

之前我们接触的远程服务,可能有RESTFUL,EJB,WEB SERVICE。RESTFUL没有注冊server,EJB、web service也没有。RMI与它们不同,注冊server相当于一个中介,远程server把存根对象(stub)发送给注冊server,然后注冊server将其保存起来。client通过注冊server提取存根,存根是个代理。代理内部通过网络连接来调用server端的代码。使用服务注冊机制方便的一点是client代码非常简洁。EJB因为没有注冊server,所以复杂的调用是通过client来实现的,client使用ejbclient类库来调用。

LocateRegistry.createRegistry代码就是启动注冊server的。

Registry registry = LocateRegistry.getRegistry();
registry.rebind(RemoteService.name, stub);

这两行代码是将存根对象通过网络发送到注冊server上。

再次,启动远程server。

执行main函数就能够同一时候启动注冊server和远程server了。

RMI是用来做分布式服务的。

分布式意味着远程server能够有多个。

由一个单独的注冊server来管理多台远程server提供的存根。

全部client都通过这唯一的一台注冊server来获取存根,调用服务。

可是问题在于注冊server仅仅有一台,当请求压力大了,注冊server非常easy爆掉!这就是RMI的瓶颈所在。

Java IDL与javaRMI的更多相关文章

  1. Java EE的十三个技术规范

    Java 是一种非常棒的语言,健壮,跨平台运行,屏蔽了具体的平台环境的要求,也就是说只要支持java 虚拟机,就可以运行java程序. 下面,我们一起学习一下J2EE的十三种技术规范. 一.JDBC: ...

  2. JDK(Java Development Kit)内置常用自带工具一览(转)

    注意:可能随着JDK的版本升级,工具也会随着增多. JDK(Java Development Kit)是Java程序员最核心的开发工具,没有之一. JDK是一个功能强大的Java开发套装,它不仅仅为我 ...

  3. java语言体系的技术简介之JSP、Servlet、JDBC、JavaBean(Application)

    转自:https://zhangkunnan.iteye.com/blog/2040462 前言 Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet. ...

  4. 精心收集java基础106条

    Java基础 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 一个Java源文件中可以定义多个类,但最多只能定义一个public的类,并且public ...

  5. Java基础知识【上】(转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  6. 【百度文库课程】Java语言基础与OOP入门学习笔记一

    一. Java的历史与由来 原名Oak,针对嵌入式系统开发设计,语法与C/C++基本一致 二. Java语言特点 Java由四方面组成:Java编程语言.Java类文件格式.Java虚拟机和Java应 ...

  7. Java学习路线图,专为新手定制的Java学习计划建议

    怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西:    首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA).J ...

  8. JAVA EE的十三种技术

    java ee 的十三中技术 一.jdbc 1). jdbc-odbc桥 2). jdbc-native 驱动桥 3). jdbc-network 桥 4). 纯java驱动 二. java命令和目录 ...

  9. What Can Java Technology Do?

    What Can Java Technology Do? The general-purpose(多用途的), high-level Java programming language is a po ...

随机推荐

  1. make gif pic

    http://www.cockos.com/licecap/ licecap 1.open licecap 2.record ,make a pic filename,like pic1 3.work ...

  2. swarm 发布服务

    1.发布服务 2.发布服务 服务发现:Swarm模式内置DNS组件,自动为每个服务分配DNS记录,然后服务的DNS名称在集群内的服务直接分发请求.负载均衡:在Swarm集群中创建服务时,Ingress ...

  3. 洛谷P2668 斗地主 [NOIP2015]

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  4. 【Visual Studio】设置使用多字符集

  5. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---32

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  6. 浮点优化选项 -ffast-math:极大地提高浮点运算速度【转】

    转自:http://blog.csdn.net/zjujoe/article/details/2604157 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 关于浮点优化选项摘 ...

  7. NYOJ 27.水池数目-DFS求连通块

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  8. (8)ftp配置文档

    1.vsftpd文件夹中的ftpusers文件的作用 它是一个黑名单,ftpusers不受任何配制项的影响 该文件存放的是一个禁止访问FTP的用户列表 管理员不希望一些拥有过大权限的帐号(比如root ...

  9. Codeforces 912D Fishes (概率&期望,优先队列的应用)

    题目链接 Fishes 题意  在一个$n*m$的矩阵中,随机选择一个$r * r$的区域覆盖. 一开始我们可以在这个$n*m$的矩阵中选择$k$个点标记为$1$. 我们要选择一个最佳的标记策略,使得 ...

  10. 洛谷——P3387 【模板】缩点

    P3387 [模板]缩点 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点, ...