基于Corba技术使用java与C++混合编程

       本文主要以开源代码omniorb4.1.1为例,服务端用C++编写,客户端用java编写。这种模式适合很多企业级SOA的实际应用,Web Sevice与不同的系统之间通过中间件桥梁通讯,中间件本身支持不同网络、异构系统、硬件和语言,从而为企业的系统资源整合提供一个最佳的解决方案。

 测试环境

1、 操作系统

WINDOWS 7

2、系统

处理器:Intel(R) Core(TM) i5-2401M CPU @ 2.30GH 2.30GH

安装内存:3.00GB (2.88 GB可用)

系统类型:32位操作系统

3、工具环境

A、myeclipse-8.6

B、j2sdk1.4.2_16(jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe)

C、VC++6.0 sp6

一、IDL编写

//

// version 0.01

//

 

interface Time{

    short get_gmt();

};

 

//

// EOF Time.idl

//

 

二、编译IDL

1、生成*.hh,*.cc

>D:\omniORB-4.1.1\src\examples\casco>omniidl -bcxx time.idl

a.time.hh

b.timeSK.cc

 

2、生成*.java

>D:\omniORB-4.1.1\src\examples\casco>idlj -fall Time.idl

a._TimeStub.java

b. Time.java

c. TimeHelper.java

d. TimeHolder.java

e. TimeOperations.java

f. TimePOA.java

 

三、JAVA客户端程序

    Java客户端程序编写之后,调试过程中会碰到很多问题,笔者把调试过程的错误一一解答,以便读者在调试过程能感受这些出现的问题,加强我们对COBRA服务程序的学习。

1、File->new->java project,按完成即可。

2、把上述*.java文件复制到testomnijava/src目录下,然后按“F5”刷新更新项目。

  

3、COBRA的C++服务程序生成请参考我写的“Corba-omniORB简单编程-IOR”和“Cobra-omniORB简单编程-命名服务”文章。

 在Unix/linux操作系统简单编译如下

a.Generate stubs and skeleton from the interface description Time.idl:

omniidl -bcxx Time.idl

 

b.Compile all source files:

g++ -c client.cpp -I$OMNIORB_ROOT/include -I$OMNIORB_ ROOT /include/omniORB4

g++ -c server.cpp -I$OMNIORB_ ROOT /include -I$OMNIORB_ ROOT /include/omniORB4

g++ -c Time_impl.cpp -I$OMNIORB_ ROOT /include -I$OMNIORB_ ROOT /include/omniORB4

g++ -c TimeSK.cpp -I$OMNIORB_ ROOT /include -I$OMNIORB_ ROOT /include/omniORB4

 

c.Link the client program:

g++ -o client client.o TimeSK.o -L$OMNIORB_ ROOT /lib -lomnithread -lomniORB4

 

Link the server program:

g++ -o server server.o TimeSK.o Time_impl.o -L$OMNIORB_ROOT /lib -lomnithread -lomniORB4

 

4、创建java客户端程序,新建一个文件testOrbClient.java,内容如下

import org.omg.CosNaming.*;

import org.omg.CORBA.*;

 

public class testOrbClient

{

    public static void main(String args[])

    {

       try

       {

           org.omg.CORBA.Object rootContextObj, managerObj;

           // 创建并初始化ORB

           ORB orb = ORB.init(args, null);

           // 得到一个用于访问命名服务和登记服务的命名上下文对象

           rootContextObj = orb.resolve_initial_references("NameService");

           // 得到一个NameComponent类型的对象

           NamingContextExt nc = NamingContextExtHelper.narrow(rootContextObj);

           // nc的id域为FirstTimeSevice,kind域为空字符串

           NameComponent name = new NameComponent("FirstTimeSevice", "");

           NameComponent path[] = { name };         

           // 从命名服务上下文中获得特定的命名服务对象        

           managerObj = nc.resolve(path);        

           // Narrow the previous object to obtain the correct type

           Time manager = TimeHelper.narrow(managerObj);

           System.out.println("OK, Let's have a look: " + manager.get_gmt());

       }

       catch (Exception e)

       {

           System.out.println("ERROR : " + e) ;

       }

    }

}

 

5、直接调试-问题1

当调试指针走到此处时会异常如下:

rootContextObj = orb.resolve_initial_references("NameService");

 

2012-3-10 12:46:31 com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl <init>

警告: "IOP00410201: (COMM_FAILURE) Connection failure: socketType: IIOP_CLEAR_TEXT; hostname: 60.63.133.171; port: 900"

org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No

    at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2172)

    at com.sun.corba.se.impl.logging.ORBUtilSystemException.connectFailure(ORBUtilSystemException.java:2193)

    at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:205)

    at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:218)

    at com.sun.corba.se.impl.transport.SocketOrChannelContactInfoImpl.createConnection(SocketOrChannelContactInfoImpl.java:101)

    at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.beginRequest(CorbaClientRequestDispatcherImpl.java:152)

    at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.request(CorbaClientDelegateImpl.java:118)

    at com.sun.corba.se.impl.resolver.BootstrapResolverImpl.invoke(BootstrapResolverImpl.java:74)

    at com.sun.corba.se.impl.resolver.BootstrapResolverImpl.resolve(BootstrapResolverImpl.java:107)

    at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(CompositeResolverImpl.java:22)

    at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(CompositeResolverImpl.java:22)

    at com.sun.corba.se.impl.resolver.CompositeResolverImpl.resolve(CompositeResolverImpl.java:22)

    at com.sun.corba.se.impl.orb.ORBImpl.resolve_initial_references(ORBImpl.java:1155)

    at testOrbClient.main(testOrbClient.java:14)

Caused by: java.net.ConnectException: Connection refused: connect

    at sun.nio.ch.Net.connect(Native Method)

    at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:507)

    at java.nio.channels.SocketChannel.open(SocketChannel.java:146)

    at com.sun.corba.se.impl.transport.DefaultSocketFactoryImpl.createSocket(DefaultSocketFactoryImpl.java:60)

    at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.<init>(SocketOrChannelConnectionImpl.java:188)

    ... 11 more

ERROR : org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 201  completed: No

注意:上述错误意味着服务没有启动!

 

6、启动java“tnameserv”服务。

 

7、直接调试-问题2

 

当调试指针走到此处时会异常如下:

managerObj = nc.resolve(path);

ERROR : org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0

 

NameComponent类型的对象nc=

IOR:000000000000002b49444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000000000010000000000000080000102000000000e36302e36332e3133332e31373100038400000035afabcb0000000020faf2e8980000000100000000000000010000000d544e616d65536572766963650000000000000004000000000a0000000000000100000001000000200000000000010001000000020501000100010020000101090000000100010100.

注意:上述错误意味着服务名称没有找到,从NC的值可以知道绑定服务是JAVA的服务!

 

 

8、启动omniorb的“tnameserv”服务,同时启动“testorbserver”服务程序。

Microsoft Windows [版本 6.1.7601]

版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

 

C:\Windows\system32>omniNames

 

Sat Mar 10 13:01:43 2012:

 

Read log file successfully.

Root context is IOR:010000002b00000049444c3a6f6d672e6f72672f436f734e616d696e672f

4e616d696e67436f6e746578744578743a312e300000010000000000000070000000010102000e00

00003139322e3136382e312e31303000f90a0b0000004e616d655365727669636500030000000000

0000080000000100000000545441010000001c000000010000000100010001000000010001050901

010001000000090101000354544108000000c5a92b4f01001f2c

Checkpointing Phase 1: Prepare.

Checkpointing Phase 2: Commit.

Checkpointing completed.

 

Microsoft Windows [版本 6.1.7601]

版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

 

C:\Windows\system32>testorbserver

The IOR of the object is: IOR:010000000d00000049444c3a54696d653a312e300000000001

0000000000000068000000010102000e0000003139322e3136382e312e3130300032c014000000ff

6d79504f41fe89e25a4f01001f900000000000020000000000000008000000010000000054544101

0000001c00000001000000010001000100000001000105090101000100000009010100

The server is ready. Awaiting for incoming requests...

 

9、直接调试

 

注意参数:-ORBInitRef NameService=corbaloc::localhost:2809/NameService

managerObj IOR=

000000000000000d49444c3a54696d653a312e3000000000000000010000000000000068000102000000000e3139322e3136382e312e31303000c03200000014ff6d79504f41fe89e25a4f01001f9000000000000000000200000000000000080000000041545400000000010000001c00000000000100010000000105010001000101090000000100010109.

 

四、总结

    在COBRA中服务端使用C++语言编写的服务,客户端使用java语言编写,此例说明corba作为语言无关的中间件实现了不同资源共享,而更重要的是各种中间件以COBRA规范标准化不同产品之间的通讯实现成为可能。

    JAVA在请求服务时要注意服务对象,在参数传递时需要我们关心服务对象的属性。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值