Java IDL与javaRMI
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的更多相关文章
- Java EE的十三个技术规范
Java 是一种非常棒的语言,健壮,跨平台运行,屏蔽了具体的平台环境的要求,也就是说只要支持java 虚拟机,就可以运行java程序. 下面,我们一起学习一下J2EE的十三种技术规范. 一.JDBC: ...
- JDK(Java Development Kit)内置常用自带工具一览(转)
注意:可能随着JDK的版本升级,工具也会随着增多. JDK(Java Development Kit)是Java程序员最核心的开发工具,没有之一. JDK是一个功能强大的Java开发套装,它不仅仅为我 ...
- java语言体系的技术简介之JSP、Servlet、JDBC、JavaBean(Application)
转自:https://zhangkunnan.iteye.com/blog/2040462 前言 Java语言 Java语言体系比较庞大,包括多个模块.从WEB项目应用角度讲有JSP.Servlet. ...
- 精心收集java基础106条
Java基础 1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 一个Java源文件中可以定义多个类,但最多只能定义一个public的类,并且public ...
- Java基础知识【上】(转载)
http://blog.csdn.net/silentbalanceyh/article/details/4608272 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...
- 【百度文库课程】Java语言基础与OOP入门学习笔记一
一. Java的历史与由来 原名Oak,针对嵌入式系统开发设计,语法与C/C++基本一致 二. Java语言特点 Java由四方面组成:Java编程语言.Java类文件格式.Java虚拟机和Java应 ...
- Java学习路线图,专为新手定制的Java学习计划建议
怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西: 首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA).J ...
- JAVA EE的十三种技术
java ee 的十三中技术 一.jdbc 1). jdbc-odbc桥 2). jdbc-native 驱动桥 3). jdbc-network 桥 4). 纯java驱动 二. java命令和目录 ...
- What Can Java Technology Do?
What Can Java Technology Do? The general-purpose(多用途的), high-level Java programming language is a po ...
随机推荐
- Java众神之路(3)-关键字(上)
关键字(上) 1.final ① 对于基本类型前加以final修饰,表示被修饰的变量为常数,不可以修改.一个既是static又是final的字段表示只占据一段不能改变的存储空间. ② final用于对 ...
- 安装最新版本的cocoapods
因为公司的iOS项目使用了cocoapods来管理第三方库,所以要求所有组员的cocoapods版本一致.一般的就是执行: $ sudo gem install -n /usr/local/bin c ...
- 【报错】IntelliJ IDEA中绿色注释扫描飘红报错解决
几天开机,突然发现自己昨天的项目可以运行,今天就因为绿色注释飘红而不能运行,很是尴尬: 解决办法如下: 1.在IDEA中的setting中搜索:"javadoc" 2.把Javad ...
- [ARC082F] Sandglass(线段树)
Description 有一个沙漏由两个上下相通玻璃球 \(A\) 和 \(B\) 构成,这两个玻璃球都含有一定量的沙子,我们暂且假定 \(AB\) 中位于上方的玻璃球的为 \(U\),下方的玻璃球为 ...
- spring rest 请求怎样添加Basic Auth请求頭
请自行揣摩代码 package com.hudai.platform.manager.util; import java.net.URI; import java.net.URISyntaxExcep ...
- this关键字、this()、super()
对于下面的代码怎么区分是哪个对象调用当前方法: Class Banana { void peel(int i); } publci Class BananaPeel { public static v ...
- php --图片加图片水印
最近在做一个视频网站需要视频有一个封面图片,但是不能是普通的图片,能让别人一眼看出来是 视频,所以我就在图片上面加了视频播放器的那种水印,具体代码如下: <?php/** * 图片加水印(适用于 ...
- Day 1 MySQL数据库
MySQL数据库_1 一.概述 1.数据(DATA) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算 ...
- json手动解析详解
项目中有时候仅仅需要一个或者多个字段时可以使用这种解析方式,省去创建实体类. 1.首先讲解下最基本的数据格式. 例如: String json="{'name':'小明','action': ...
- Codeforces 897 C.Nephren gives a riddle-递归
C. Nephren gives a riddle time limit per test 2 seconds memory limit per test 256 megabytes input ...