文档章节

CORBA版HelloWorld

goto-array
 goto-array
发布于 2014/05/01 01:00
字数 811
阅读 44
收藏 1

CORBA,是一个很古老的技术,甚至诞生于Java之前,不过随着WebService、SOA、RMI等等技术的出现,CORBA由于过于复杂而渐渐淡出了人们的视线,不过在一些交互性很强的系统异构应用领域,CORBA似乎很重要,比如中国联通、移动、美国的数字电视系统应用领域,是CORBA把整个系统核心部分集成起来的。如果没有异构的、需要预留标准接口的、交互性很强的应用,你不应该考虑使用COBRA。

 

CORBA目前的最近版本规范是3.2,Java1.5、1.6均支持该版本。

 

CORBA比较亲和C++,对Java程序员来说,开始CORBA应用难度比较大,以至于网上找一个真正能跑的HelloWorld都很难。

 

下面是我经过阅读SUN的CORBA文档,所做的一个完整的HelloWorld实例:

 

一、定义IDL

 

module HelloApp{ 
        interface Hello{ 
                string sayHello(); 
                oneway void shutdown(); 
        }; 
};

 

没有IDL的专门的开发工具,写起来容易出错,而且不美观,IDEA勉强支持语法高亮,但不支持格式化和语法校验!

 

二、从IDL生成存根

 

进入IDL文件存放目录,然后执行:idlj -fall Hello.idl

 

会生成一批Java文件:

 

helloCorba\src\HelloApp

HelloPOA.java 
_HelloStub.java 
HelloHolder.java 
HelloHelper.java 
Hello.java 
HelloOperations.java

 

三、实现IDL接口,开发服务端程序

 

import HelloApp.Hello; 
import HelloApp.HelloHelper; 
import HelloApp.HelloPOA; 
import org.omg.CORBA.ORB; 
import org.omg.CosNaming.NameComponent; 
import org.omg.CosNaming.NamingContextExt; 
import org.omg.CosNaming.NamingContextExtHelper; 
import org.omg.PortableServer.POA; 
import org.omg.PortableServer.POAHelper; 

class HelloImpl extends HelloPOA { 
        private ORB orb; 

        public void setORB(ORB orb_val) { 
                orb = orb_val; 
        } 

        // implement sayHello() method 
        public String sayHello() { 
                return "\nHello world !!\n"
        } 

        // implement shutdown() method 
        public void shutdown() { 
                orb.shutdown(false); 
        } 


public class HelloServer { 

        public static void main(String args[]) { 
                try { 
                        //创建一个ORB实例 
                        ORB orb = ORB.init(args, null); 

                        //得到一个RootPOA的引用,并激活POAManager 
                        POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); 
                        rootpoa.the_POAManager().activate(); 

                        // create servant and register it with the ORB 
                        //创建一个HelloImpl实例(servant),并注册到ORB上 
                        HelloImpl helloImpl = new HelloImpl(); 
                        helloImpl.setORB(orb); 

                        //从服务中得到对象的引用 
                        org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); 
                        Hello href = HelloHelper.narrow(ref); 

                        //得到一个根名称的上下文 
                        org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); 
                        // Use NamingContextExt which is part of the Interoperable 
                        // Naming Service (INS) specification. 
                        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); 

                        //在命名上下文中绑定这个对象 
                        String name = "Hello"
                        NameComponent path[] = ncRef.to_name(name); 
                        ncRef.rebind(path, href); 

                        System.out.println("HelloServer ready and waiting ..."); 

                        //启动线程服务,等待客户端的调用 
                        orb.run(); 
                }catch (Exception e) { 
                        System.err.println("ERROR: " + e); 
                        e.printStackTrace(System.out); 
                } 
                System.out.println("HelloServer Exiting ..."); 
        } 
}

 

四、实现CORBA的客户端

 

import HelloApp.Hello; 
import HelloApp.HelloHelper; 
import org.omg.CORBA.ORB; 
import org.omg.CosNaming.NamingContextExt; 
import org.omg.CosNaming.NamingContextExtHelper; 

public class HelloClient { 
        static Hello helloImpl; 

        public static void main(String args[]) { 
                try { 
                        //创建一个ORB实例 
                        ORB orb = ORB.init(args, null); 

                        //获取根名称上下文 
                        org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); 
                        // Use NamingContextExt instead of NamingContext. This is 
                        // part of the Interoperable naming Service. 
                        NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); 

                        //从命名上下文中获取接口实现对象 
                        String name = "Hello"
                        helloImpl = HelloHelper.narrow(ncRef.resolve_str(name)); 

                        //调用接口对象的方法 
                        System.out.println("Obtained a handle on server object: " + helloImpl); 
                        System.out.println(helloImpl.sayHello()); 
                        helloImpl.shutdown(); 

                } catch (Exception e) { 
                        System.out.println("ERROR : " + e); 
                        e.printStackTrace(System.out); 
                } 
        }

}

 

五、运行

 

1)运行CORBA服务

orbd -ORBInitialPort 1050 -ORBInitialHost 192.168.14.117

 

2)运行CORBA应用的服务端

java HelloServer -ORBInitialPort 1050

 

输出:

HelloServer ready and waiting ... 
HelloServer Exiting ...

 

3)运行CORBA应用的客户端

java HelloClient -ORBInitialHost 192.168.14.117 -ORBInitialPort 1050

 

Obtained a handle on server object: IOR:000000000000001749444c3a48656c6c6f4170702f48656c6c6f3a312e30000000000001000000000000008a000102000000000f3139322e3136382e31342e313137000006db000000000031afabcb00000000206d3bb80000000001000000000000000100000008526f6f74504f410000000008000000010000000014000000000000020000000100000020000000000001000100000002050100010001002000010109000000010001010000000026000000020002 

Hello world !!

 

呵呵,很垃圾吧,但是客户要,我们就做!

 

太费劲了,如果做一个接口很复杂,参数很多,自定义类型不少的CORBA应用,复杂度将很好,如果经常改,那就更加郁闷了。








本文转载自:http://lavasoft.blog.51cto.com/62575/240268/

共有 人打赏支持
goto-array
粉丝 5
博文 26
码字总数 3575
作品 0
江门
程序员
私信 提问
关于CORBA的问题

大家好,我想请问一下,哪位高手有关于CORBA框架的实现版本MICO的一些技术文档。目前想学习下。源代码我已经下载下来,并成功编译,版本号是:mico-2.3.13。 目前读源代码感觉很麻烦,想找高...

zhlsunshine
2012/03/12
175
0
Java RMI之HelloWorld篇

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该...

方绍伟
2013/09/18
0
0
CXF的简单使用

Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,...

蜡笔小小小新
2015/09/26
19
0
深入理解Magento – 第五章 – Magento资源配置

深入理解Magento 作者:Alan Storm 翻译:Hailong Zhang 第五章 – Magento资源配置 对于任何一个更新频繁的项目来说,保持开发环境和生产环境的数据库同步是件很头疼的事情。Magento提供了一...

虫虫
2010/04/26
2K
8
Apache CXF 和 Spring 开发 Web Service 1

正文 为什么使用CXF 本文段摘录自 http://www.ibm.com/developerworks/cn/webservices/ws-pojo-springcxf/index.html Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务...

洋葱94
2015/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-13(Mybatis基本概念和简单的例子)

在mybatis初次学习Mybatis的时候,遇到了很多问题,虽然阿里云的视频有教学,但是视频教学所使用的软件和我自己使用的软件不用,我自己用的数据库是oracle数据库,开发环境是idea。而且视频中...

白话
今天
4
0
Java基础:String、StringBuffer和StringBuilder的区别

1 String String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。 String类的包含如下定义: /** The value is used for character storage. */private final cha...

watermelon11
今天
2
0
mogodb服务

部署MongoDB 官网: https://www.mongodb.com/download-center/community 创建mongo数据目录 mkdir /data/mongodb 二进制部署 wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x8......

以谁为师
昨天
5
0
大神教你Debian GNU/Linux 9.7 “Stretch” Live和安装镜像开放下载

Debian项目团队于昨天发布了Debian GNU/Linux 9 "Stretch" 的第7个维护版本更新,重点修复了APT软件管理器中存在的安全漏洞。在敦促每位用户尽快升级系统的同时,Debian团队还发布了Debian ...

linux-tao
昨天
4
0
PHP 相关配置

1. php-fpm的pool 编辑php-fpm配置文件php-fpm.con vim /usr/local/php/etc/php-fpm.conf //在[global]部分增加以下内容 include = etc/php-fpm.d/*.conf # 相当与Nginx的虚拟主机文件 “vho......

Yue_Chen
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部