CORBA开发指南:从基础到服务器搭建
1. IDL与Java数据类型映射
IDL(Interface Definition Language)和Java有不同的数据类型,在CORBA开发中,需要进行相应的映射。以下是常见IDL数据类型与Java数据类型的映射关系:
| IDL数据类型 | Java数据类型 | 定义 |
| — | — | — |
| octet | byte | 一个八位字节值映射到Java的byte类型 |
| string | java.lang.String | IDL中字符串是8位字符值序列,可能有长度限制;Java中java.lang.String表示16位字符序列。若Java字符串超出IDL字符串可接受范围,会抛出CORBA异常 |
| wstring | java.lang.String | IDL包含Unicode规范,宽字符串直接映射到Java字符串。若Java字符串超出IDL有界字符串长度,会抛出CORBA异常 |
| short | short | IDL的short是有符号16位值,Java的short也是有符号16位值 |
| unsigned short | short | IDL的无符号short是无符号16位值,Java所有数值类型都是有符号的,处理无符号值时需谨慎 |
| long | int | IDL的long表示32位值,Java的int表示32位整数,处理无符号值需谨慎 |
| long long | long | IDL的long long是64位值,Java的long是64位值,处理无符号值需谨慎 |
| float | float | IDL的float与Java的float相同 |
| double | double | IDL的double与Java的double相同 |
2. CORBA基础
当为CORBA对象创建接口定义文件后,IDL编译器会生成客户端存根和服务器骨架。一个IDL接口至少会生成七个Java类文件,这些文件组成了客户端存根、服务器骨架、辅助方法、操作、持有者类、绑定类和接口定义。例如,对于以下IDL示例:
module ChalkTalk {
typedef sequence<string> CourseName;
interface CourseData;
};
会生成以下文件:
| 文件名 | 描述 |
| — | — |
| CourseDataStub.java | 管理与服务对象通信的客户端存根代码 |
| CourseData.java | 声明CourseData接口 |
| CourseDataHelper.java | 提供绑定对象、缩小引用、读取对象和写入对象等辅助实用工具 |
| CourseDataHolder.java | 用于在Java中实现按引用调用的方法 |
| CourseDataOperations.java | 根据IDL文件定义方法签名 |
| CourseDataPOA.java | 管理服务对象创建和调用的服务器骨架代码 |
| CourseDataPOATie.java | 实现绑定机制的服务器骨架代码 |
| CourseNameHelper.java | 为CourseName序列提供序列化辅助方法 |
| CourseNameHolder.java | 使CourseName数组可以按引用传递 |
客户端应用程序创建客户端存根并调用方法,方法调用会转换为相应的CORBA调用。典型的客户端应用程序需要初始化ORB库、定位服务对象、将服务对象转换为正确的接口定义,然后调用方法。
3. 设置JBuilder和CORBA
要在JBuilder中启用CORBA支持,需先选择一个CORBA ORB产品。JBuilder开箱支持Visibroker和Orbix CORBA产品,JBuilder企业版将Visibroker作为企业服务器应用服务器版的一部分。设置步骤如下:
1. 打开JBuilder,选择“Tools”菜单,然后选择“Enterprise Setup”。
2. 在“Enterprise Setup”对话框中选择“CORBA”选项卡。
3. 在“Configuration”字段中选择ORB供应商,对话框还提供以下选项:
| 选项 | 描述 |
| — | — |
| Apply this configuration to the current project | 使用所选配置修改当前项目设置 |
| Make this configuration ORB the default for the Java VM | 修改orb.properties文件并设置Java VM的默认ORB类。若选择此选项后出错,可能没有权限更改orb.properties文件,需咨询安全管理员 |
| Add a Visibroker Smart Agent item to the Tools menu | 若所选配置为Visibroker,可将Smart Agent产品添加到“Tools”菜单。非Visibroker产品此选项禁用 |
| SmartAgent port | 设置本地Smart Agent的端口,更改端口后需停止并重新启动Smart Agent |
如果在对话框中找不到ORB供应商,可使用“New”按钮创建;若ORB供应商在下拉列表中但安装位置不同,可能需要编辑其配置设置。编辑配置对话框包含以下字段:
| 字段 | 描述 |
| — | — |
| Name for this configuration | 表示图中“Configuration”下拉框中的名称 |
| Path for ORB tools | ORB供应商工具的位置,特别是IDL编译器和Smart Agent工具所需 |
| Library for projects | ORB运行所需的必要库文件,从库列表中选择 |
| IDL compiler command | 执行IDL编译器所需的命令 |
| Command option for output directory | 将生成的服务器骨架和客户端存根文件重定向到新位置所需的IDL编译器选项 |
设置好CORBA供应商后,对象库应包含一个CORBA选项卡,其中的项目将被启用。CORBA选项卡提供不同的CORBA项目用于创建CORBA应用程序:
| CORBA项目 | 描述 |
| — | — |
| Sample IDL | 根据模板文件创建IDL文件,是快速开始编写自己IDL文件的方法 |
| CORBA Client Interface | 使用现有IDL文件生成基本的CORBA客户端应用程序 |
| CORBA Server Interface | 使用现有IDL文件为选定接口生成基本CORBA服务器类的实现骨架 |
| HTML CORBA Client | 使用现有IDL文件使用Java Server Pages (JSP)生成基本的CORBA HTML客户端应用程序 |
| CORBA Server Application | 使用现有IDL文件为所有接口生成默认服务器应用程序,服务器应用程序中会写入日志和CORBA对象监控代码 |
4. 构建CORBA服务器
构建CORBA服务器时,设计公共接口(API)至关重要,因为它是服务器应用程序与所有使用该服务器的应用程序之间的契约。创建CORBA服务器的步骤如下:
graph LR
A[定义IDL接口] --> B[编译接口为服务器骨架文件]
B --> C[使用CORBA向导实现服务器]
C --> D[启动命名服务]
D --> E[启动CORBA服务器]
E --> F[验证CORBA服务器是否运行]
- 定义IDL接口 :以信用评分系统为例,以下是示例IDL:
module dbCorba {
interface CreditRating {
short getCreditScore(in string name, out long creditscore);
};
};
此IDL创建了一个全局命名空间
dbCorba
和一个名为
CreditRating
的接口,其中
getCreditScore
方法接受一个字符串类型的输入参数
name
和一个长整型的输出参数
creditscore
,并返回一个短整型表示方法执行结果。
-
编译接口为服务器骨架文件
:JBuilder会自动识别
.IDL
文件并调用
idl2java
编译器。在创建IDL文件之前,需检查项目属性以验证IDL编译器是否已设置。在“Project Properties”对话框的“Build”选项卡和“IDL”子选项卡中,可以设置IDL编译器和其他选项,如包名、包含路径、附加选项和条件编译符号等。还可以通过右键单击IDL文件并选择“Properties”来设置额外的IDL编译选项。设置好后,右键单击项目面板中的IDL文件,选择“make”即可编译IDL文件,生成客户端存根和服务器骨架文件。
-
使用CORBA向导实现服务器
:选择“File” -> “New”,在对象库中选择CORBA选项卡中的“CORBA Server Application”。向导允许选择IDL文件和生成服务器应用程序的包位置,还提供独特的日志和监控系统,可选择禁用。最后一步可创建新的运行时配置。向导生成的文件如下:
| 文件名 | 描述 |
| — | — |
| dbCorbaAppGenFileList.html | 包含所有生成文件列表的HTML页面 |
| dbCorbaServerApp.java | 创建服务对象和POA的主服务器应用程序文件,将服务对象注册到POA并等待方法调用 |
| CreditRatingImpl.java |
CreditRating
接口的实际实现,需修改此文件以实现具体方法 |
| ServerFrame.java, ServerMonitor.java, ServerMonitorPage.java, ServerResources.java | 组成服务器应用程序的监控和日志功能 |
例如,修改
CreditRatingImpl.java
文件中的
getCreditScore
方法如下:
public short getCreditScore(String name,
org.omg.CORBA.IntHolder creditscore) {
Random rnd = new Random();
ServerMonitor.log("(" + _name + ") CreditRatingImpl.java getCreditScore()");
creditscore.value = rnd.nextInt();
return (short)0;
}
- 启动命名服务 :如果使用Visibroker,从“Tools”主菜单中选择“Visibroker Smart Agent”,它会像典型的Java应用程序一样在JBuilder环境中运行。命名服务必须在启动服务器应用程序之前启动,否则服务器应用程序虽看似运行,但无法向命名服务注册。
- 启动CORBA服务器 :确保命名服务正在运行,选择“Run” -> “Run Project”启动CORBA服务器。服务器运行时会创建服务器监控表单。
-
验证CORBA服务器是否运行
:在Visibroker中,可使用
osfind命令定位Visibroker Smart Agent并发现已向其注册的服务器对象,以此确认CORBA服务器是否正在运行。
CORBA开发指南:从基础到服务器搭建
5. 常见问题及解决方法
在CORBA开发过程中,可能会遇到一些常见问题,以下是一些问题及对应的解决方法:
| 问题 | 表现 | 解决方法 |
| — | — | — |
| 权限问题 | 选择“Make this configuration ORB the default for the Java VM”选项后出错 | 可能没有权限更改
orb.properties
文件,需咨询安全管理员 |
| 端口冲突 | 启动Smart Agent时提示端口被占用 | 更改
SmartAgent port
设置,停止并重新启动Smart Agent |
| IDL编译失败 | 右键点击IDL文件选择“make”后无法生成客户端存根和服务器骨架文件 | 检查项目属性中IDL编译器的设置,包括路径、命令等;检查IDL文件是否存在语法错误 |
| 服务器无法注册 | 服务器应用程序看似运行,但无法向命名服务注册 | 确保命名服务已启动;检查命名服务的配置是否正确 |
6. 性能优化建议
为了提高CORBA应用程序的性能,可以考虑以下优化建议:
1.
合理设计接口
:避免在接口中定义过多的方法和参数,减少不必要的网络传输。例如,将相关的操作合并到一个方法中,避免多次调用。
2.
使用缓存
:对于一些频繁使用的数据,可以使用缓存机制,减少对数据库或其他资源的访问。例如,在服务器端使用内存缓存存储常用的信用评分数据。
3.
优化序列化和反序列化
:选择高效的序列化和反序列化方式,减少数据处理时间。例如,使用二进制序列化代替文本序列化。
4.
负载均衡
:在分布式环境中,使用负载均衡技术将请求均匀分配到多个服务器上,提高系统的并发处理能力。
7. 扩展与集成
CORBA应用程序可以与其他系统进行扩展和集成,以下是一些常见的集成场景和方法:
| 集成场景 | 集成方法 |
| — | — |
| 与数据库集成 | 使用JDBC(Java Database Connectivity)连接数据库,在CORBA服务器中实现数据的读写操作。例如,在
CreditRatingImpl.java
中使用JDBC查询数据库获取信用评分 |
| 与Web应用集成 | 使用Java Server Pages (JSP) 或Servlet将CORBA服务暴露给Web客户端。例如,使用“HTML CORBA Client”生成的JSP页面调用CORBA服务 |
| 与第三方系统集成 | 通过消息队列、RESTful API等方式与第三方系统进行通信。例如,使用Apache Kafka消息队列将CORBA服务的结果发送给第三方系统 |
8. 总结
CORBA(Common Object Request Broker Architecture)提供了一种强大的分布式对象通信机制,通过IDL(Interface Definition Language)定义接口,实现客户端和服务器之间的跨平台通信。本文详细介绍了CORBA开发的基础知识,包括IDL与Java数据类型的映射、CORBA基础概念、JBuilder和CORBA的设置、CORBA服务器的构建步骤,以及常见问题的解决方法、性能优化建议和扩展集成方法。
在实际开发中,需要注意以下几点:
1. 设计公共接口时要谨慎,确保其稳定性和扩展性,避免对现有接口进行频繁修改。
2. 正确配置IDL编译器和CORBA ORB产品,确保生成的客户端存根和服务器骨架文件的正确性。
3. 注意处理无符号值,因为Java中所有数值类型都是有符号的。
4. 定期进行性能测试和优化,确保应用程序的性能和稳定性。
通过掌握CORBA开发的相关知识和技巧,开发者可以构建高效、稳定的分布式应用程序,满足不同场景的需求。
以下是一个简单的mermaid流程图,总结CORBA服务器开发的整体流程:
graph LR
A[选择CORBA ORB产品] --> B[设置JBuilder和CORBA]
B --> C[定义IDL接口]
C --> D[编译IDL接口]
D --> E[使用向导实现服务器]
E --> F[启动命名服务]
F --> G[启动CORBA服务器]
G --> H[验证服务器运行]
H --> I[处理常见问题和优化]
I --> J[扩展与集成]
希望本文能为CORBA开发的初学者提供一些帮助,让大家更好地理解和应用CORBA技术。
超级会员免费看
1035

被折叠的 条评论
为什么被折叠?



