前言
在进行分布式任务调度之前,首先要对分布式Service和Feature进行注册,注册Feature之前需要注册一个与之同名的Service,Feature才能注册成功。
Service的定义和注册
Service的定义
Service的定义和注册在foundation\distributedschedule\dmsfwk_lite\source\dmslite.c文件中,相应的定义如下,其中,g_distributedService是全局唯一的分布式服务对象:
// 该定义实现了面向对象中构造函数的概念
static DistributedService g_distributedService = {
.GetName = GetName,
.Initialize = Initialize,
.MessageHandle = MessageHandle,
.GetTaskConfig = GetTaskConfig
};
DistributedService结构体的定义如下:
typedef struct {
INHERIT_SERVICE;
Identity identity;
} DistributedService;
DistributedService结构体中继承了INHERIT_SERVICE宏,INHERIT_SERVICE宏中包含四个成员,其定义如下:
/**
* INHERIT_SERVICE包含了所有Service都要有的成员
* GetName():获取服务名
* Initialize():初始化服务
* MessageHandler():消息处理
* GetTaskConfig():获取任务配置信息,包括level、priority、stackSize、queueSize、taskFlags
*/
#define INHERIT_SERVICE \
const char *(*GetName)(Service * service); \
BOOL (*Initialize)(Service * service, Identity identity); \
BOOL (*MessageHandle)(Service * service, Request * request); \
TaskConfig (*GetTaskConfig)(Service * service)
Service的注册
Service注册对应的代码如下:
static void Init()
{
// 使用全局唯一的g_distributedService调用SAMGR对象注册分布式服务,并将注册结果打印至日志
BOOL result = SAMGR_GetInstance()->RegisterService((Service *)&g_distributedService);
HILOGI("[dms service start %s]", result ? "success" : "failed");
}
// 使用SYS_SERVICE_INIT定义了分布式调度服务的初始化函数
SYS_SERVICE_INIT(Init);
DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。
`欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案)
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......
Feature的定义和注册
Feature的定义
Feature的定义和注册与服务类似,在foundation\distributedschedule\dmsfwk_lite\source\dmslite_feature.c文件中实现,相应的定义如下:
DmsLite g_dmslite = {
/* feature functions */
.GetName = GetName,
.OnInitialize = OnInitialize,
.OnStop = OnStop,
.OnMessage = OnMessage,
.identity = {-1, -1, NULL},
/* dms interface for other subsystems */
DEFAULT_IUNKNOWN_ENTRY_BEGIN,
.StartRemoteAbility = StartRemoteAbilityInner,
DEFAULT_IUNKNOWN_ENTRY_END
};
DmsLite结构体的定义如下:
typedef struct {
/* as a feature */
INHERIT_FEATURE;
/* implement the dmslite interface */
INHERIT_IUNKNOWNENTRY(DmsProxy);
Identity identity;
} DmsLite;
DmsLite中继承了INHERIT_FEATURE宏,包含四个成员,定义如下:
typedef struct {
/* as a feature */
INHERIT_FEATURE;
/* implement the dmslite interface */
INHERIT_IUNKNOWNENTRY(DmsProxy);
Identity identity;
} DmsLite;
Feature的注册
Feature注册的代码如下:
// 使用g_dmslite调用SAMGR_GetInstance()得到Samgr的对象,并注册Feature和FeatureApi
static void Init()
{
BOOL result = SAMGR_GetInstance()->RegisterFeature(DISTRIBUTED_SCHEDULE_SERVICE, (Feature*) &g_dmslite);
if (!result) {
HILOGE("[dms register feature failed]");
}
result = SAMGR_GetInstance()->RegisterFeatureApi(DISTRIBUTED_SCHEDULE_SERVICE,
DMSLITE_FEATURE, GET_IUNKNOWN(g_dmslite));
if (!result) {
HILOGE("[dms register feature api failed]");
}
}
// SYS_FEATURE_INIT和SYS_SERVICE_INIT类似,用来初始化Feature的Init()函数
SYS_FEATURE_INIT(Init);
总结
Service和Feature的注册是分布式任务调度的先前条件,后续的步骤都需在该条件下进行。Service和Feature在foundation\distributedschedule\safwk_lite\src\main.c文件中被注册,由g_dmslite中的OnInitialize()初始化,由软总线发布,并创建一个TCP的Session会话,用于解析TCP数据。