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(); }}