事件路由

1. 概述

業務軟件設計開發過程當中會依賴一些基礎組件, 事件路由就是常見的基礎組件。 本模塊結合業務場景, 定製了一個基本的事件路由模塊。api

本文主要介紹了事件路由模塊及其使用方法, 用於指導用戶開發。數據結構

2. 架構原理

事件路由模塊, 提供了一種事件分發的框架。 用戶能夠本身定義事件以及事件的處理策略。 具體系統框圖組成及對外接口關係如圖 15-1 所示。架構

圖15-1 事件路由模塊系統框圖框架

歸納來講, 事件路由模塊主要由如下部分構成:異步

  • 訂閱者

用戶自定義訂閱者: 訂閱者名稱, 事件處理函數, 用戶擴展參數, 事件是否同步處理。函數

  • 事件定義

用戶自定義事件:事件 ID, 參數 1, 參數 2, 處理結果, 建立時間, 負載。this

  • 事件發佈

支持事件統一發布。線程

  • 事件處理者

訂閱者支持異步處理事件, 內部啓動線程獨立處理。設計

  • 歷史事件

支持上一次事件的查詢。指針

3. API 參考

該功能模塊爲用戶提供如下 API:

  • HI_EVTHUB_Init: 初始化事件路由模塊。
  • HI_EVTHUB_Deinit: 去初始化事件路由模塊。
  • HI_EVTHUB_Register: 註冊事件。
  • HI_EVTHUB_UnRegister: 解註冊事件。
  • HI_EVTHUB_Publish: 發佈事件。
  • HI_EVTHUB_CreateSubscriber: 建立訂閱者。
  • HI_EVTHUB_DestroySubscriber:銷燬訂閱者。
  • HI_EVTHUB_Subscribe: 訂閱事件。
  • HI_EVTHUB_UnSubscribe:解訂閱事件。
  • HI_EVTHUB_GetEventHistory:獲取歷史事件。
  • HI_EVTHUB_SetEnabled:設置使能標記。
  • HI_EVTHUB_GetEnabled:獲取使能標記。

HI_EVTHUB_Init

【描述】

初始化事件路由模塊。

【定義】

HI_S32 HI_EVTHUB_Init();

【參數】

無。

【返回值】

返回值 描述
0 成功。
非 0 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

該模塊是單實例, 僅需一次初始化。

【舉例】

無。

HI_EVTHUB_Deinit

【描述】

去初始化事件路由模塊。

【定義】

HI_S32 HI_EVTHUB_Deinit();

【參數】

無。

【返回值】

返回值 描述
0 成功。
非 0 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

無。

【舉例】

無。

HI_EVTHUB_Register

【描述】

註冊事件。

【定義】

HI_S32 HI_EVTHUB_Register(HI_EVENT_ID EventID);

【參數】
參數名稱 | 描述 | 輸入/輸出
--- | ---| ---
EventID| 事件 ID。| 輸入

【返回值】
返回值| 描述
---| ---
0 | 成功。
非 0 | 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

無。

【舉例】

無。

HI_EVTHUB_UnRegister

【描述】

解註冊事件。

【定義】

HI_S32 HI_EVTHUB_UnRegister(HI_EVENT_ID EventID);

【參數】

參數名稱 描述 輸入/輸出
EventID 事件 ID。 輸入

【返回值】
返回值 | 描述
---|---
0 | 成功。
非 0 | 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

無。

【舉例】

無。

HI_EVTHUB_Publish

【描述】

發佈事件。

【定義】

HI_S32 HI_EVTHUB_Publish(HI_EVENT_S *pEvent);

【參數】

參數名稱 描述 輸入/輸出
pEvent 事件指針。 輸入

【返回值】

返回值 描述
0 成功。
非 0 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

無。

【舉例】

無。

HI_EVTHUB_CreateSubscriber

【描述】

建立訂閱者。

【定義】

HI_S32 HI_EVTHUB_CreateSubscriber(HI_SUBSCRIBER_S pstSubscriber,HI_MW_PTR ppSubscriber);

【參數】

參數名稱 描述 輸入/輸出
pstSubscriber 訂閱者參數。 輸入
ppSubscriber 訂閱者句柄指針。 輸出

【返回值】
返回值 | 描述
---|---
0 | 成功。
非 0 | 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

無。

【舉例】

無。

HI_EVTHUB_DestroySubscriber

【描述】

銷燬訂閱者。

【定義】

HI_S32 HI_EVTHUB_DestroySubscriber(HI_MW_PTR pSubscriber);

【參數】
參數名稱| 描述| 輸入/輸出
---|---|---
pSubscriber| 訂閱者句柄。| 輸入

【返回值】

返回值 描述
0 成功。
非 0 失敗,參見錯誤碼。

HI_EVTHUB_Subscribe

【描述】

訂閱事件。

【定義】

HI_S32 HI_EVTHUB_Subscribe(HI_MW_PTR pSubscriber,HI_EVENT_ID EventID);

【參數】

參數名稱 描述 輸入/輸出
pSubscriber 訂閱者句柄。 輸入
EventID 事件 ID。 輸入

【返回值】

返回值 描述
0 成功。
非 0 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

無。

【舉例】

無。

HI_EVTHUB_UnSubscribe

【描述】

解訂閱事件。

【定義】

HI_S32 HI_EVTHUB_UnSubscribe(HI_MW_PTR pSubscriber,HI_EVENT_ID EventID);

【參數】

參數名稱 描述 輸入/輸出
pSubscriber 訂閱者句柄。 輸入
EventID 事件 ID。 輸入

【返回值】
返回值| 描述
---|---
0 | 成功。
非 0 | 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

無。

【舉例】

無。

HI_EVTHUB_GetEventHistory

【描述】

獲取歷史事件。

【定義】

HI_S32 HI_EVTHUB_GetEventHistory(HI_S32 EventID,HI_EVENT_S *pEvent);

【參數】

參數名稱 描述 輸入/輸出
EventID 事件 ID。 輸入
pEvent 事件指針。 輸出

【返回值】

返回值 描述
0 成功。
非 0 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

無。

【舉例】

無。

HI_EVTHUB_SetEnabled

【描述】

設置使能標記。

【定義】

HI_S32 HI_EVTHUB_SetEnabled(HI_BOOL bFlag);

【參數】
參數名稱 | 描述| 輸入/輸出
---|---|---
bFlag | 使能標記。| 輸入

【返回值】

返回值 描述
0 成功。
非 0 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

無。

【舉例】

無。

HI_EVTHUB_GetEnabled

【描述】

獲取使能標記。

【定義】

HI_S32 HI_EVTHUB_GetEnabled(HI_BOOL *pFlag);

【參數】
參數名稱| 描述| 輸入/輸出
---| ---|---
pFlag | 使能標記指針。| 輸出

【返回值】
返回值 | 描述
---|---
0 | 成功。
非 0 | 失敗,參見錯誤碼。

【需求】

  • 頭文件: hi_eventhub.h
  • 庫文件: libeventhub.a/ libeventhub.so

【注意】

無。

【舉例】

無。

4. 數據類型

事件路由模塊相關數據類型定義以下:

  • EVENT_PAYLOAD_LEN: 事件負載數據最大長度。
  • HI_EVTHUB_SUBSCRIBE_NAME_LEN: 訂閱者名稱最大長度。
  • HI_EVTHUB_MESSAGEQURUR_MAX_SIZE: 消息隊列最大值。
  • HI_EVENT_ID: 事件 ID。
  • HI_EVENT_S: 事件結構體。
  • HI_SUBSCRIBER_S: 訂閱者結構體。

EVENT_PAYLOAD_LEN

【說明】

事件負載數據最大長度。

【定義】

#define EVENT_PAYLOAD_LEN (512)

【注意事項】

無。

【相關數據結構及接口】

無。

HI_EVTHUB_SUBSCRIBE_NAME_LEN

【說明】

訂閱者名稱的最大長度。

【定義】

#define HI_EVTHUB_SUBSCRIBE_NAME_LEN (16)

【注意事項】

無。

【相關數據類型及接口】

HI_EVTHUB_SUBSCRIBE_NAME_LEN

【說明】

訂閱者名稱的最大長度。

【定義】

#define HI_EVTHUB_SUBSCRIBE_NAME_LEN (16)

【注意事項】

無。

【相關數據類型及接口】

HI_EVTHUB_MESSAGEQURUR_MAX_SIZE

【說明】

消息隊列最大值。

【定義】

#define HI_EVTHUB_MESSAGEQURUR_MAX_SIZE (32)

【注意事項】

無。

【相關數據類型及接口】

無。

HI_EVTHUB_MESSAGEQURUR_MAX_SIZE

【說明】

消息隊列最大值。

【定義】

#define HI_EVTHUB_MESSAGEQURUR_MAX_SIZE (32)

【注意事項】

無。

【相關數據類型及接口】

無。

HI_EVENT_S

【說明】

定義事件結構體。

【定義】

typedef struct hiEVENT_S
{
    HI_EVENT_ID EventID;
    HI_S32 arg1;
    HI_S32 arg2;
    HI_S32 s32Result;
    HI_U64 u64CreateTime;
    HI_CHAR aszPayload[EVENT_PAYLOAD_LEN];
} HI_EVENT_S;

【成員】

成員名稱 描述
EventID 事件 ID
arg1 參數一
arg2 參數二
s32Result 處理結果
u64CreateTime 建立時間
aszPayload 負載數據

【注意事項】

建立時間在事件發佈時, 由模塊內部獲取系統 clock 時間填充, 單位秒/s。

【相關數據類型及接口】

HI_SUBSCRIBER_S

【說明】

定義訂閱者結構體。

【定義】

typedef struct hiSUBSCRIBER_S
{
    HI_CHAR azName[HI_EVTHUB_SUBSCRIBE_NAME_LEN];
    HI_S32 (*HI_EVTHUB_EVENTPROC_FN_PTR)(HI_EVENT_S* pEvent, HI_VOID* argv);
    HI_VOID* argv;
    HI_BOOL bSync;
}HI_SUBSCRIBER_S;

【成員】
成員名稱 | 描述
---|---
azName| 訂閱者名稱。
HI_EVTHUB_EVENTPROC_FN_PTR| 訂閱者事件處理函數。
argv| 用戶定義私有參數指針。
bSync| 事件處理是否同步。

【注意事項】

無。

【相關數據類型及接口】

無。

5 錯誤碼

事件路由模塊 API 錯誤碼如表 15-1 所示。

表15-1 事件路由 API 錯誤碼

錯誤代碼 宏定義 描述
0xA1328002 HI_ERR_EVTHUB_NULL_PTR 空指針錯誤
0xA1328008 HI_ERR_EVTHUB_NOT_INIT 未初始化錯誤
0xA1328040 HI_ERR_EVTHUB_HANDLE_INVALID 非法句柄錯誤。
0xA1328041 HI_ERR_EVTHUB_INVALIDARG 非法參數
0xA1328042 HI_ERR_EVTHUB_MALLOC 內存申請錯誤
0xA1328043 HI_ERR_EVTHUB_CREATE 建立錯誤
0xA1328044 HI_ERR_EVTHUB_DESTROY 銷燬錯誤
0xA1328045 HI_ERR_EVTHUB_NOT_CREATE 對象沒有建立
0xA1328046 HI_ERR_EVTHUB_EVENT_NO_RIGEST 事件未註冊
0xA1328047 HI_ERR_EVTHUB_NO_EVENT_HISTORY 歷史事件不存在
0xA1328048 HI_ERR_EVTHUB_MSGHDL_SEND 事件路由消息發送錯誤
相關文章
相關標籤/搜索