多事件引擎实现

来源:互联网 发布:编程项目 编辑:程序博客网 时间:2024/04/26 07:02
初级实现的事件引擎是单实例的,存在应用限制.

1.背景

在主站上ipe_b,data_sync_i都是事件处理器,共用一个t_Sys_EventQueue。
一个事件处理者只有一个CEventHandleMap,其中每个事件只有一个对应的处理函数.
ehong扫描t_Sys_EventQueue,扫描未处理的事件.调用每个注册的事件处理器。
若一个事件2个插件都要响应,第1个事件处理器成功或者按可忽略的错误(如没有对应规则处理)设置事件记录的处理状态.
如果此时进程意外终止,则第2个事件处理器将没有机会对该事件响应。

目前iep_b和data_sync_i都处理的事件有:
    event_controller_->register_handler(EVENT_NEW_GOODS,this,1);
    event_controller_->register_handler(EVENT_GOODSINFO_CHANGED,this,1);

iep_b用于主站业务单据在企业之间的自动转换.也包含上述事件的处理.
响应EVENT_NEW_GOODS,把对于平台的新商品立即写入到主站t_bas_goods表及图片
响应EVENT_GOODSINFO_CHANGED,执行的是把(eid,goodsid)的记录从缓存中删除.

这是在单主站模式下的实现手段:单主站模式下,平台数据库和企业数据库是同一数据库. 

在多主站结构下,如此是错误的.
1.违背了t_bas_goods为只读副本的设计
2.EVENT_GOODSINFO_CHANGED的含义是t_bas_goods的信息改变了,根本不应该存在eid概念.其行为不合逻辑.

因此,从iep_b中删除EVENT_NEW_GOODS,EVENT_GOODSINFO_CHANGED事件的相应代码.

对于iep_b的任何事件,如EVENT_NEW_ORDER.
如果是data_sync_i先处理,顺序取决于iep_b,data_sync_i的加载次序.先加载先处理.

由于data_sync_i没有处理EVENT_NEW_ORDER的规则,将会返回ERROR_NOFOUND_RULE错误.
为避免阻塞,这类错误的记录将被忽略,data_sync_i向ehong登记了可忽略错误:
ehong_->add_ignored_error(ERROR_NOFOUND_RULE);

如果此时进程终止(如由于异常),则iep_b将不会在有机会处理此事件。导致单据没有被转换.

2.方案

事件引擎的3种实现模式:
。单引擎,多处理者:通过HandlerID区分
。单引擎,多存储实例(t_Sys_EventQueue)
。多引擎,每引擎一个存储实例

多引擎可提高并发。
通常事件处理者负责记录和处理感兴趣的事件。
由事件处理者指定所使用的事件引擎,引擎采用唯一名字区分,需要统一规划。
如iep_b使用ee_iep_b,data_sync_i使用ee_data_sync_i。

ehong定义全部事件引擎,各个处理者按名字使用.

3.改造实现

4.使用

如data_sync_i插件中使用.
string ehong_name_; ///< 事件引擎名称
实现代码:
///< 读事件引擎名称配置int CDataSynci::ReadPrivateConfig() {///...READ_STRING(root,"event_engine_name",this->ehong_name_);        return 0;}///< 获取指定的事件引擎int CDataSynci::CheckValid() {parent::CheckValid();IEhongCluster *eec = reinterpret_cast<IEhongCluster*>(container_->GetResource(EHONG_CLUSTER));  ehong_ = eec->get_ee(this->ehong_name_.c_str());ehong_->add_ignored_error(ERROR_NOFOUND_RULE);///...return 0;}

data_sync_i.conf相关配置:
<?xml version="1.0" encoding="gb2312" standalone="yes"?><config><!-- 事件引擎名称 --><event_engine_name>ee_data_sync_i</event_engine_name></config>

5.配置

ehong.conf配置如下:
<?xml version="1.0" encoding="gb2312" standalone="yes"?><config><dbc>yoopa</dbc><units><unit><!-- 引擎名称 --><name>default</name><!-- 事件队列表处理间隔时间,单位:秒.默认:10 --><event_queue_scan_interval>60</event_queue_scan_interval> </unit><unit><!-- 引擎名称 --><name>ee_data_sync_i</name><!-- 数据库连接 --><dbc>yoopa</dbc><!--  数据库表名 --><table_name>t_sys_eventqueue_ds</table_name><!-- 事件队列镜像连接名 --><mirror_dbc></mirror_dbc><!-- 事件队列镜像表名 --><mirror_table_name></mirror_table_name><!-- 事件队列表处理间隔时间,单位:秒.默认:10 --><event_queue_scan_interval>60</event_queue_scan_interval> </unit></units></config>
default:作为默认引擎的名字.
默认引擎的数据库表名:t_Sys_EventQueue,镜像表名:t_Sys_EventMirror.数据库采用<dbc>设置.

如果未配置<units>则创建一个默认引擎.


0 0