体验CORBA组件模型CCM:2、实例
摘要:
通过一个简单的实例,详细介绍基于CIAO的CCM组件开发过程。
正文:
前面讲过,CCM是以EJB为蓝本来定义的,因此,二者在组件分类(与EJB被分为Session、Entity、Message Driven三种类型一样,CCM组件被分为Service、Session、Process、Entity四种类型)、组件的基本组成、开发/部署基本流程等方面十分相似,但由于目前CCM组件应用服务器/应用框架等远不如EJB成熟,在开发环境的支持方面也远不如EJB完善,因此,其开发过程还比较繁琐。
下面将围绕如下的应用需求详细讨论CIAO平台下CCM开发的详细过程:
一个Monitor程序负责监视多台设备的状态,且每个设备上均运行一个设备控制程序Controller,Controller的客户端通过该组件提供的接口来操控Controller;按照常规的方法,可以采用轮询的方式,Monitor定期向Controller查询设备目前的状态信息,也可以通过Event Service在Controller与Monitor间建立事件通道。在这里,我们采用CCM来解决上述问题。
整个系统包括两个组件Controller和Monitor;当设备启动时,Controller通过Monitor提供的DeviceIDAllocator接口获得由Monitor分配的唯一标识信息(如IP地址等信息,本例中为简化问题,该唯一标识仅由一个表示名称的字符串组成,且Monitor不会记忆已分配给每个设备的标识);当Controller状态发生变化时,向Monitor发布DeviceStatus状态变化通知事件。
一、编写IDL
IDL文件被用于描述组件Controller、Monitor之间的通信接口、组件的基本组成(包括组件所支持的Facet/Receptacle、eventtype、Event Source/Event Sink、Component Home、组件的Attribute等)以及组件对外提供的接口。
步骤:
1、建立一个目录DeviceAdmin,在该目录下创建三个子目录:Controller、DeviceBase、Monitor,分别作为Controller组件工程文件、组件公共工程文件、Monitor组件工程文件的存放目录。
2、在DeviceBase下建立如下idl文件,其中定义了一些组件间通信需要用到的基本接口及结构。
//DeviceBase.idl
#include <Components.idl>
module Device {
const long MAX_RUN_LEVEL = 5;
const long MIN_RUN_LEVEL = 0;
// a demo device unique id
struct DeviceID {
string device_name;
};
// a demo device status
struct DeviceStatus {
long run_level;
};
struct StatusPair {
DeviceID device_id;
DeviceStatus device_status;
};
/**
* @event DeviceStatus
*
* @brief component event between Monitor and Controller
* Controller publishes this event when status change.
*/
eventtype StatusEvent {
public StatusPair status_pair;
};
/**
* @interface DeviceIDAllocator
*
* @brief Controller use this facet to get a unique id from Monitor
*/
interface D