corba中间件

  • 格式:doc
  • 大小:62.00 KB
  • 文档页数:8

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模块2module BillingApp{3// 声明接口4interface Billing{5string successBilling();6oneway 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?9import org.omg.CORBA.ORB;10import BillingApp.*;11class BillingImpl extends BillingPOA{12private ORB orb;13public void setORB(ORB orb_val){14this.orb = orb_val;15}16/**17* 实现successBilling()方法18*/19public String successBilling() {20return "\nBilling success!!\n";21}22/**23* 实现shutdown()方法24*/25public void shutdown(){26orb.shutdown(false);27}28}【BillingServer.java源码】:view plaincopy to clipboardprint?29import org.omg.CORBA.ORB;30import Component;31import org.omg.CosNaming.NamingContextExt;32import org.omg.CosNaming.NamingContextExtHelper;33import org.omg.PortableServer.POA;34import BillingApp.*;35public class BillingServer {36public static void main(String args[]){37try{38// 创建和初始化ORB39ORB orb = ORB.init(args, null);40// 获得根POA的引用并激活POAManager41POA rootpoa =(POA)orb.resolve_initial_references("RootPOA");42rootpoa.the_POAManager().activate();43// 创建servant并注册到ORB44BillingImpl billingImpl = new BillingImpl();45billingImpl.setORB(orb);46// 从servant获得对象引用47org.omg.CORBA.Object ref =rootpoa.servant_to_reference(billingImpl);48Billing href = BillingHelper.narrow(ref);49// 得到根命名上下文50org.omg.CORBA.Object objRef =orb.resolve_initial_references("NameService");51// 使用命名上下文,它是互操作命名服务规范的一部分52NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);53// 在命名中绑定对象引用54String name = "Billing";55NameComponent path[] = ncRef.to_name(name);56ncRef.rebind(path, href);57System.out.println("BillingServer is ready and waiting...");58// 等待客户端调用59orb.run();60}catch(Exception e){61System.err.println("ERROR:"+e);62 e.printStackTrace(System.out);63}64System.out.println("BillingServer Exiting ...");65}66}4)实现客户端与第三步类似,可以使用idlj产生的stub作为客户端应用程序的基础。