corba中间件.doc_第1页
corba中间件.doc_第2页
corba中间件.doc_第3页
corba中间件.doc_第4页
corba中间件.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java&CORBA编程实例Java IDL技术在Java平台上添加了CORBA(Common Object Request Broker Architecture)功能,提供了基于标准的互操作能力和连接性。Java IDL技术使得分布式的Java Web应用能够通过使用工业标准的IDL和IIOP(Internet Inter-ORB Protocol)来透明地调用远程网络服务的操作。运行时组件(Runtime Components)包括了一个用于分布式计算且使用IIOP通信的Java ORB.可移植对象适配器(Portable Object Adapter,POA)CORBA对象的负责分隔服务器端远程调用句柄 (handler)到远程对象和它的服务者(servant)。对象由远程调用所暴露,而服务者包含实际处理这些请求的方法。每个对象都可以选择服务者为 静态的(一次)或动态的(每个远程调用),在这两种情况下,都允许调用转移到另一台服务器。在服务器端,POA形成了类似树状的结构,每个POA都负责一到多个服务的对象。树的分支可以是独立活动的、或钝化的,服务者调用有不同的代码和不同的请求处理策略。API规范 * org.omg.CORBA 包 - 提供了OMG CORBA APIs到Java编程语言的映射 * org.omg.CosNaming 包 - 为Java IDL提供命名服务 * org.omg.PortableServer 包 - 为建立服务器端的可移植的、跨越多ORB的应用程序提供类和接口 * org.omg.PortableInterceptor 包 - 提供了注册ORB钩子的机制,此钩子通过ORB服务能截取正常的ORB执行流 * org.omg.DynamicAny 包 - 提供了使得任何值都能被动态解释(或遍历)和通过DynAny对象构造出来的类和接口 * org.omg.CORBA.ORB - 为CORBA ORB功能的API分布式对象之间的关系有两方面:客户端和服务器。服务器提供远程接口,客户端调用远程接口。在客户端,应用程序包括远程对象的引用。该对象引用有stub方法,它是独立的远程方法。stub方法实际连接到ORB,因此调用它实际上转发调用到服务器。在服务器端,ORB使用skeleton代码翻译远程调用为本地对象的方法调用。Skeleton把调用转换成指定实现的格式,并在方法中调用。当方法返回时,Skeleton代码转换方法调用的结果或错误,经ORB送回客户端。Java IDL开发过程1)定义远程接口使用IDL语言为远程对象定义接口。【Billing.idl源代码】如下:view plaincopy to clipboardprint?1 / 声明CORBA IDL模块 2 module BillingApp 3 / 声明接口 4 interface Billing 5 string successBilling(); 6 oneway void shutdown(); 7 ; 8 ; 2)编译远程接口使用idlj编译器生成Java语言的stub和skeleton源文件。idlj编译器缺省只生成客户端的binding代码。如果同时需要客户端的bindings和服务器端的skeletons,必须加上-fall选项。使用POA(Portable Object Adaptor)的优点: 允许编程者构建对象在不同ORB产品之间的可移植实现 支持带持久化标识的对象 对对象的透明活动提供支持 允许单个servant支持多种对象同时标识注意:确定jdk/bin目录下有:idlj、java、javac、orbd命令: idlj -fall Billing.idl在当前目录下生成BillingApp目录,包含如下六个文件: Billing.java 此接口包含IDL接口的Java版本。它继承自org.omg.CORBA.Object,提供标准的CORBA对象功能。 BillingHelper.java 此类提供辅助功能,Helper类负责读写数据类型到CORBA流,以及插入和提取数据类型。 BillingHolder.java This final class holds a public instance member of type Billing. BillingOperations.java 此接口包含successBilling()和shutdown()方法。 BillingPOA.java 此抽象类是基于流的服务器Skeleton,为服务器提供基本的CORBA功能。它继承org.omg.PortableServer.Servant, 实现了InvokeHandler接口和BillingOperations接口。服务器类BillingServant继承BillingPOA。 _BillingStub.java 此类是客户端stub,为客户端提供CORBA功能。它继承org.omg.CORBA.Object,提供标准CORBA对象功能。还扩展了 BillingOperations接口和org.omg.CORBA.portable.IDLEntity接口。3)实现服务器端一旦使用idlj编译器后,就可以使用它产生的Skeleton装配服务器应用程序了。另外要实现远程接口方法,服务器代码应包含启动ORB和等待远程客户端调用的机制。服务器端由两个类组成,一个是servant,另一个是Server。servant是BillingImpl类,是Billing IDL接口的实现,每个Billing实例均由BillingImpl实例实现。servant是BillingPOA的子类。servant包含了IDL定义的所有方法,与通常的Java方法类似。server类含服务器的main()方法,它: 创建和初始化ORB实例 获得根POA的引用并激活POAManager 创建一个Servant实例(CORBA的Billing对象的实现)并通知ORB 获得根命名上下文 在命名上下文用“Billing”名注册新对象 等待客户端调用此新对象【BillingImpl.java源码】:view plaincopy to clipboardprint?9 import org.omg.CORBA.ORB; 10 import BillingApp.*; 11 class BillingImpl extends BillingPOA 12 private ORB orb; 13 public void setORB(ORB orb_val) 14 this.orb = orb_val; 15 16 /* 17 * 实现successBilling()方法 18 */ 19 public String successBilling() 20 return nBilling success!n; 21 22 /* 23 * 实现shutdown()方法 24 */ 25 public void shutdown() 26 orb.shutdown(false); 27 28 【BillingServer.java源码】:view plaincopy to clipboardprint?29 import org.omg.CORBA.ORB; 30 import org.omg.CosNaming.NameComponent; 31 import org.omg.CosNaming.NamingContextExt; 32 import org.omg.CosNaming.NamingContextExtHelper; 33 import org.omg.PortableServer.POA; 34 import BillingApp.*; 35 public class BillingServer 36 public static void main(String args) 37 try 38 / 创建和初始化ORB 39 ORB orb = ORB.init(args, null); 40 / 获得根POA的引用并激活POAManager 41 POA rootpoa = (POA)orb.resolve_initial_references(RootPOA); 42 rootpoa.the_POAManager().activate(); 43 / 创建servant并注册到ORB 44 BillingImpl billingImpl = new BillingImpl(); 45 billingImpl.setORB(orb); 46 / 从servant获得对象引用 47 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(billingImpl); 48 Billing href = BillingHelper.narrow(ref); 49 / 得到根命名上下文 50 org.omg.CORBA.Object objRef = orb.resolve_initial_references(NameService); 51 / 使用命名上下文,它是互操作命名服务规范的一部分 52 NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); 53 / 在命名中绑定对象引用 54 String name = Billing; 55 NameComponent path = ncRef.to_name(name); 56 ncRef.rebind(path, href); 57 System.out.println(BillingServer is ready and waiting.); 58 / 等待客户端调用 59 orb.run(); 60 catch(Exception e) 61 System.err.println(ERROR:+e); 62 e.printStackTrace(System.out); 63 64 System.out.println(BillingServer Exiting .); 65 66 4)实现客户端与第三步类似,可以使用idlj产生的stub作为客户端应用程序的基础。客户端代码建立于stub之上,启动ORB,使用服务器提供的命名服务查询,获得远程对象的引用,调用其方法。【BillingClient.java源码】:view plaincopy to clipboardprint?67 import org.omg.CORBA.ORB; 68 import org.omg.CosNaming.NamingContextExt; 69 import org.omg.CosNaming.NamingContextExtHelper; 70 import BillingApp.*; 71 public class BillingClient 72 static Billing billingImpl; 73 public static void main(String args) 74 try 75 / 创建和初始化ORB 76 ORB orb = ORB.init(args, null); 77 System.out.println(ORB initialised); 78 / 获得根命名上下文 79 org.omg.CORBA.Object objRef = orb.resolve_initial_references(NameService); 80 / 使用NamingContextExt代替命名上下文,它是互操作命名服务的一部分 81 NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); 82 / 在命名中解析对象引用 83 String name = Billing; 84 billingImpl = BillingHelper.narrow(ncRef.resolve_str(name); 85 86 System.out.println(Obtained a handle on server object: +billingImpl); 87 System.out.println(billingImpl.successBilling(); 88 billingImpl.shutdown(); 89 catch(Exception e) 90 System.out.println(ERROR: +e); 91 e.printStackTrace(System.out); 92 93 94 5)启动应用程序要运行服务器和客户端,必须先启动命名服务,再启动服务器,最后运行客户端。此例用到命名服务,它使得servant对象的操作对客户端有效。服务器需要命名服务的对象引用,命名服务可以发布对象引用实现各种接口。客户端使用对象引用来调用方法。Java SE 1.4以上提供了两种可选的命名服务: tnameserv一种透明的命名服务 orbd包含自启动服务、透明的命名服务、持久化命名服务和命名管理器的后台处理进程。本例使用orbd。5.1)启动orbd注意:Solaris系统运行要求root权限并以1024端口开始进程。因此,对所有OS,可以选用大于或等于1024的端口以实现统一。-ORBInitialPort选项用于指定端口(非缺省状态)。例如:假定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论