当前位置:天才代写 > tutorial > JAVA 教程 > 一个例子(CORBA)

一个例子(CORBA)

2017-11-13 08:00 星期一 所属: JAVA 教程 浏览:404

这儿显示的代码大概并不详尽,因为差异的ORB有差异的要领来会见CORBA处事,所以无论什么例子都要取决于详细的厂商(下例利用了JavaIDL,这是Sun公司的一个免费产物。它配套提供了一个简化版本的ORB、一个定名处事以及一个“IDL→Java”编译器)。除此之外,由于Java仍处在成长初期,所以在差异的Java/CORBA产物里并不是包括了所有CORBA特性。
我们但愿实现一个处事器,令其在一些呆板上运行,其他呆板能向它查询正确的时间。我们也但愿实现一个客户,令其请求正确的时间。在这种环境下,我们让两个措施都用Java实现。但在实际应用中,往往别离回收差异的语言。

1. 编写IDL源码
第一步是为提供的处事编写一个IDL描写。这凡是是由处事器措施员完成的。随后,措施员就可用任何语言实现处事器,只需那种语言里存在着一个CORBA IDL编译器。
IDL文件已分发给客户端的措施员,并成为两种语言间的桥梁。
下面这个例子展示了时间处事器的IDL描写环境:
 

module RemoteTime {
   interface ExactTime {
      string getTime();
   };
};

这是对RemoteTime定名空间内的ExactTime接口的一个声明。该接口由单唯一个要领组成,它以字串名目返回当前时间。

2. 建设根干
第二步是编译IDL,建设Java根干代码。我们将操作这些代码实现客户和处事器。与JavaIDL产物配套提供的东西是idltojava:
idltojava -fserver -fclient RemoteTime.idl
个中两个标志汇报idltojava同时为根和干生成代码。idltojava会生成一个Java包,它在IDL模块、RemoteTime以及生成的Java文件置入RemoteTime子目次后定名。_ExactTimeImplBase.java代表我们用于实现处事器工具的“干”;而_ExactTimeStub.java将用于客户。在ExactTime.java中,用Java方法暗示了IDL接口。另外还包括了用到的其他支持文件,譬喻用于简化会见定名处事的文件。

3. 实现处事器和客户
各人在下面看到的是处事器端利用的代码。处事器工具是在ExactTimeServer类里实现的。RemoteTimeServer这个应用的浸染是:建设一个处事器工具,通过ORB为其注册,指定工具引用时回收的名称,然后“宁静”地等待客户发出请求。
 

import RemoteTime.*;

import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
import org.omg.CORBA.*;

import java.util.*;
import java.text.*;

// Server object implementation
class ExactTimeServer extends _ExactTimeImplBase{
  public String getTime(){
    return DateFormat.
        getTimeInstance(DateFormat.FULL).
          format(new Date(
              System.currentTimeMillis()));
  }
}

// Remote application implementation
public class RemoteTimeServer {
  public static void main(String args[])  {
    try {
      // ORB creation and initialization:
      ORB orb = ORB.init(args, null);
      // Create the server object and register it:
      ExactTimeServer timeServerObjRef = 
        new ExactTimeServer();
      orb.connect(timeServerObjRef);
      // Get the root naming context:
      org.omg.CORBA.Object objRef = 
        orb.resolve_initial_references(
          "NameService");
      NamingContext ncRef = 
        NamingContextHelper.narrow(objRef);
      // Assign a string name to the 
      // object reference (binding):
      NameComponent nc = 
        new NameComponent("ExactTime", "");
      NameComponent path[] = {nc};
      ncRef.rebind(path, timeServerObjRef);
      // Wait for client requests:
      java.lang.Object sync =
        new java.lang.Object();
      synchronized(sync){
        sync.wait();
      }
    }
    catch (Exception e)  {
      System.out.println(
         "Remote Time server error: " + e);
      e.printStackTrace(System.out);
    }
  }
}

正如各人看到的那样,处事器工具的实现长短常简朴的;它是一个普通的Java类,从IDL编译器生成的“干”代码中担任而来。但在与ORB以及其他CORBA处事举办接洽的时候,环境却变得稍微有些巨大。

4. 一些CORBA处事
这里要简朴先容一下JavaIDL相关代码所做的事情(留意临时忽略了CORBA代码与差异厂商有关这一事实)。main()的第一行代码用于启动ORB。并且理所虽然,这正是处事器工具需要同它举办相同的原因。就在ORB初始化今后,紧接着就建设了一个处事器工具。实际上,它正式名称应该是“短期处事工具”:从客户哪里吸收请求,“保留时间”与建设它的历程是沟通的。建设好短期处事工具后,就会通过ORB对其举办注册。这意味着ORB已知道它的存在,可将请求转发给它。
到今朝为止,我们拥有的全部对象就是一个timeServerObjRef——只有在当前处事器历程里才有效的一个工具引用。下一步是为这个处事工具分派一个字串形式的名字。客户会按照谁人名字寻找处事工具。我们通过定名处事(Naming Service)完成这一操纵。首先,我们需要对定名处事的一个工具引用。通过挪用resolve_initial_references(),可得到对定名处事的字串式工具引用(在JavaIDL中是“NameService”),并将这个引用返回。这是对回收narrow()要领的一个特定NamingContext引用的模子。我们此刻可开始利用定名处事了。
为了将处事工具同一个字串形式的工具引用绑定在一起,我们首先建设一个NameComponent工具,用“ExactTime”举办初始化。“ExactTime”是我们想用于绑定处事工具的名称字串。随后利用rebind()要领,这是受限于工具引用的字串化引用。我们用rebind()分派一个引用——纵然它已经存在。而假使引用已经存在,那么bind()会造成一个异常。在CORBA中,名称由一系列NameContext组成——这即是我们为什么要用一个数组将名称与工具引用绑定起来的原因。
处事工具最好筹备好由客户利用。此时,处事器历程会进入一种等待状态。同样地,由于它是一种“短期处事”,所以保留时间要受处事器历程的限制。JavaIDL今朝尚未提供对“耐久工具”(只要建设它们的历程保持运行状态,工具就会一直存在下去)的支持。
此刻,我们已对处事器代码的事情有了必然的认识。接下来看看客户代码:
 

import RemoteTime.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;

public class RemoteTimeClient {
  public static void main(String args[]) {
    try {
      // ORB creation and initialization:
      ORB orb = ORB.init(args, null);
      // Get the root naming context:
      org.omg.CORBA.Object objRef = 
        orb.resolve_initial_references(
          "NameService");
      NamingContext ncRef = 
        NamingContextHelper.narrow(objRef);
      // Get (resolve) the stringified object 
      // reference for the time server:
      NameComponent nc = 
        new NameComponent("ExactTime", "");
      NameComponent path[] = {nc};
      ExactTime timeObjRef = 
        ExactTimeHelper.narrow(
          ncRef.resolve(path));
      // Make requests to the server object:
      String exactTime = timeObjRef.getTime();
      System.out.println(exactTime);
    } catch (Exception e) {
      System.out.println(
         "Remote Time server error: " + e);
      e.printStackTrace(System.out);
    }
  }
}

#p#分页标题#e#

前几行所做的事情与它们在处事器历程里是一样的:ORB得到初始化,并理会出对定名处事的一个引用。
接下来,我们需要用随处事工具的一个工具引用,所以将字串形式的工具引用直接通报给resolve()要领,并用narrow()要领将功效造型到ExactTime接口引用里。最后挪用getTime()。

5. 激活名称处事历程
此刻,我们已别离得到了一个处事器和一个客户应用,它们已作好彼此间举办相同的筹备。各人知道两者都需要操作定名处事绑定息争析字串形式的工具引用。在运行处事可能客户之前,我们必需启动定名处事历程。在JavaIDL中,定名处事属于一个Java应用,是随产物配套提供的。但它大概与其他产物有所差异。JavaIDL定名处事在JVM的一个实例里运行,并(默认)监督网络端口900。

6. 激活处事器与客户
此刻,我们已筹备好启动处事器和客户应用(之所以按这一顺序,是由于处事器的存在是“短期”的)。若各个方面都配置无误,那么得到的就是在客户节制台窗口内的一行输出文字,提醒我们当前的时间是几多。虽然,这一功效自己并没有什么令人欢快的。但应留意一个问题:纵然都处在同一台呆板上,客户和处事器应用仍然运行于差异的虚拟机内。它们之间的通信是通过一个根基的集成层举办的——即ORB与定名处事的集成。
这只是一个简朴的例子,面向非网络情况设计。但凡是将ORB设置成“与位置无关”。若处事器与客户别离位于差异的呆板上,那么ORB可用一个名为“安装库”(Implementation Repository)的组件理会出长途字串式引用。尽量“安装库”属于CORBA的一部门,但它险些没有详细的规格,所以各厂商的实现方法是不尽沟通的。
正如各人看到的那样,CORBA尚有很多方面的问题未在这儿举办具体报告。但通过以上的先容,应已对其有一个根基的认识。若想得到CORBA更具体的资料,最传真的起点莫过于OMB Web站点,地点是http://www.omg.org。这个处所提供了富厚的文档资料、白页、措施以及对其他CORBA资源和产物的链接。

 

    关键字:

天才代写-代写联系方式