9.6一个RM的分式应用的实 t·用RM编写一个分布式应用,核心有以下三方面 原·定位远程对象 1.一个应用可以利用RM的名字服务功能注册器远程 学计算机 对象。 2.可以象操作普通对象一样传送并返回一个远程对象 的引用(指针)。 系·与远程对象通信: 底层的通信由RMI实现,对于系统开发人员来说,远 代 程调用和标准的Java方法调用没有什么区别。 平·为需要传递的对象装载类的字节码 RMI允许调用者向远程对象传递一个对象,因此RMI 提供这种装载对象的机制
北 京 大 学 计 算 机 系 代 亚 非 1 9.6 一个RMI的分布式应用的实例 • 用RMI编写一个分布式应用,核心有以下三方面: • 定位远程对象 – 1. 一个应用可以利用RMI的名字服务功能注册器远程 对象。 – 2. 可以象操作普通对象一样传送并返回一个远程对象 的引用(指针)。 • 与远程对象通信: – 底层的通信由RMI实现,对于系统开发人员来说,远 程调用和标准的Java方法调用没有什么区别。 • 为需要传递的对象装载类的字节码 – RMI允许调用者向远程对象传递一个对象,因此RMI 提供这种装载对象的机制
9.6一个RM的分式应用的实 北京大学计算机系代亚非 Web server Client URL protocol /RMI RMII URL protocol Server ○ ARMI Web server registry URL protocol 2
北京大学计算机系代亚非 2 9.6 一个RMI的分布式应用的实例 Web Server Client Server Web Server registry URL protocol RMI RMI URL protocol URL protocol RMI
9.6一个RM的分式应用的实 问题的提出 task 北京大学计算机系代亚非 Client Remote object task Compute engin Client S erver task Client 3
北 京 大 学 计 算 机 系 代 亚 非 3 9.6 一个RMI的分布式应用的实例 Compute engin Server Remote object Client task Client task Client task 一、问题的提出
9.6一个RM的分式应用的实 ·分布特点 engin开发,先运行,task后定义写engn时不对执行什么 任务作任何规定任务可以是任意定制的 大学计算机系代亚非 前提条件: 定义任务的类要规定任务的实现步骤使得这个任务 能够提交给 engin去执行使用 Server上的CPU资源 技术支持: RMI的动态装载功能
北 京 大 学 计 算 机 系 代 亚 非 4 9.6 一个RMI的分布式应用的实例 • 分布特点: – engin开发,先运行,task后定义.写engin时不对执行什么 任务作任何规定.任务可以是任意定制的. • 前提条件: – 定义任务的类,要规定任务的实现步骤,使得这个任务 能够提交给engin去执行.使用server上的 CPU资源. • 技术支持: – RMI的动态装载功能
9.6一个RM的分式应用的实 A m10 compute 北京大学计算机系 远程方法、○○○ engine m 远程对象+A ComputeTask client server executeTask execute 远程对象必须继承远程接口 确定那些方法是远程方法,为此定义远程接口 代远程接口只负责提供方法名不一共实现细节因此必须由一个对 菲象来实现接口
北 京 大 学 计 算 机 系 代 亚 非 5 9.6 一个RMI的分布式应用的实例 远程对象 client server A m1 远程方法 A.m1() 远程对象必须继承远程接口 确定那些方法是远程方法,为此定义远程接口 远程接口只负责提供方法名,不一共实现细节,因此必须由一个对 象来实现接口 executeTask compute engine Compute execute Task
9.6一个RM的分式应用的实 设计一个服务器 北京大学计 核心协议:提交任务执行任务,返回结果 client client 机 系·在jav中远程调用是通过定义远程接口来实现的, 个接口只能有一个方法 代·不同类型的任务,只要他们实现了Task类型就可 亚以在 engIn上运行 非·实现这个接口的类可以包含任何任务计算需要的 数据以及和任何任务计算需要的方法
北 京 大 学 计 算 机 系 代 亚 非 6 9.6 一个RMI的分布式应用的实例 • 二、设计一个服务器 • 核心协议:提交任务,执行任务,返回结果 client client • 在java中远程调用是通过定义远程接口来实现的, 一个接口只能有一个方法 • 不同类型的任务,只要他们实现了Task类型,就可 以在engin上运行. • 实现这个接口的类,可以包含任何任务计算需要的 数据以及和任何任务计算需要的方法
9.6一个RM的分式应用的实 (1)定义远程接口 ·第一个接囗 ompute package comput compute import java rmi Remote; ngine 计 import java rmi RemoteException; public interface Compute extends remote Compute Task 机 i Object execute Task(Task t throws RemoteException; 3 execute Task execute 业 package compute 第二个接口:定义一个task类型, EF import java. io Serializable; 作为参数传给 execute Task方法, public interface Task extends规定了engn与它的任务之间的 Serializable 接口,以及如何启动它的任务它 i Object execute; 不是一个远程接口
北 京 大 学 计 算 机 系 代 亚 非 7 9.6 一个RMI的分布式应用的实例 (1)定义远程接口 • 第一个接口:compute package compute; import java.rmi.Remote; import java.rmi.RemoteException; public interface Compute extends Remote { Object executeTask(Task t) throws RemoteException;} package compute; import java.io.Serializable; public interface Task extends Serializable { Object execute(); } 第二个接口:定义一个task类型, 作为参数传给executeTask方法, 规定了engin与它的任务之间的 接口,以及如何启动它的任务.它 不是一个远程接口 executeTask compute engine Compute execute Task
9.6一个RM的分式应用的实 北· Compute engin的设计要考虑以下问题: 劇.1. compute enginey是个类 ComputeEngine它实现 享了 Compute接口,只要调用该类的方法 executeTask, 计任务就能提交上来 邡2,提交任务的 Client端程序并不知道任务是被下载 紫到 Engin.上执行的因此cet在定义任务时并不需要 包含如何安装的 server端的代码 代返回类型是对象如果结果是基本类型,需要转化 成相应的对等类 非·4.用规定任务如何执行的代码填写 execute法
北 京 大 学 计 算 机 系 代 亚 非 8 9.6 一个RMI的分布式应用的实例 • Compute engin的设计要考虑以下问题: • 1. compute engine是一个类 ComputeEngine ,它实现 了 Compute接口,只要调用该类的方法executeTask, 任务就能提交上来. • 2. 提交任务的Client 端程序并不知道任务是被下载 到engin上执行的.因此client在定义任务时并不需要 包含如何安装的server端的代码. • 3. 返回类型是对象,如果结果是基本类型,需要转化 成相应的对等类. • 4. 用规定任务如何执行的代码填写execute方法
9.6一个RM的分式应用的实 (2)实现远程接口 肉·一般说来实现一个远程接口的类至少有以下步骤: 过声明远程接口 算·2为远程对象定义构造函数 紫·3.实现远程方法 engin中创建对象的工作可以在实现远程接口类的 代maim函数中实现 亚·1.创建并安装安全管理器 非·2.创建一个或更多的远程对象的实例 3至少注册一个远程对象
北 京 大 学 计 算 机 系 代 亚 非 9 9.6 一个RMI的分布式应用的实例 (2)实现远程接口 • 一般说来,实现一个远程接口的类至少有以下步骤: • 1. 声明远程接口 • 2. 为远程对象定义构造函数 • 3. 实现远程方法 engin中创建对象的工作可以在实现远程接口类的 main函数中实现: • 1. 创建并安装安全管理器 • 2. 创建一个或更多的远程对象的实例 • 3. 至少注册一个远程对象
package engine; import java rmi. " import java rmi server. import compute. *; public class Compute Engine extends UnicastRemoteobject implements Compute i public Compute Engined throws Remote exception supero public object execute Task(Task t) return t execute; public static void main(Stringll args) fif(system. getSecurityManagero==null) t System. setSecurityManager(new RMISecurityManagero);) String name=//host/Compute try( Compute engine= new ComputeEngine0; Naming rebind(name, engine) System. out. printIn("Compute Engine bound); 3 catch(Exception e) System. err printIn( " ComputeEngine exception: e.getMessageO);e.printstackTrace0;
北 京 大 学 计 算 机 系 代 亚 非 10 9.6 一个RMI的分布式应用的实例 package engine; import java.rmi.*; import java.rmi.server.*; import compute.*; public class ComputeEngine extends UnicastRemoteObject implements Compute { public ComputeEngine() throws RemoteException { super(); } public Object executeTask(Task t) { return t.execute(); } public static void main(String[] args) { if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } String name = "//host/Compute"; try { Compute engine = new ComputeEngine(); Naming.rebind(name, engine); System.out.println("ComputeEngine bound"); } catch (Exception e) { System.err.println("ComputeEngine exception: " + e.getMessage()); e.printStackTrace(); }}