HelloWorld插件示例
最快速的方式了解WA-EDGE插件开发的方式是开始编译和执行插件示例plugin-hello
该目录下包含两个插件子目录:client
和service
,分别展示微服务的client和server的角色。
下载代码
在Ubuntu系统上下载代码:
编译
cd ./samples/plugin-hello
./build_hello.sh
打包插件
cd ./samples/plugin-hello
./build_hello.sh -a
快速运行插件
运行插件需要使用一个简易的框架程序,从源码编译得到simple-edge-broker
cd samples/simple-edge-broker/
./build_broker.sh run
该命令会编译简易框架,并加载运行hello world插件。
在专用线程中执行回调函数
执行下面命令来打开代码中的WA_THREAD_DEMO宏,启用在专用线程中执行回调函数:
- client侧的response handler
- service侧的resource handler
cd samples/simple-edge-broker/
WA_THREAD_DEMO=true ./build_broker.sh run
1. 资源实现函数 (service端)
下面代码提供调用WA_SetRemotePoster
, 指定用job_poster
函数来分发来自总线上的微服务请求消息。
static void E2EModule_Start(MODULE_HANDLE module)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)module;
RESTFUL_CONTEXT ctx = WA_InitRestful(module_data->broker, module, "mod-server");
module_data->restful_context = ctx;
WA_SetRemotePoster(ctx, job_poster, module_data);
ThreadAPI_Create(&module_data->threadHandle, service_HandlingThread, module_data);
}
函数job_poster
将消息转发至线程service_HandlingThread
所拥有的消息队列。dlist_node_try_process
会触发资源回调函数的执行。
static void job_poster (void * job, RemoteHandler job_handler, void * arg_for_poster)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)arg_for_poster;
dlist_post(module_data->internal_queue, T_Message_Handler, job, job_handler);
}
int service_HandlingThread(void *param)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)param;
while(1)
{
dlist_node_t job = dlist_get_wait(module_data->internal_queue, 10);
if(job)
{
if(!dlist_node_try_process(job))
{
WARNING2("failed to process job!");
dlist_node_free(job);
}
}
}
return 0;
}
2. 回复消息回调函数 (client端)
下面代码提供调用WA_SetRemotePoster
, 指定用job_poster
函数来分发来自总线上的微服务请求消息。
static void E2EModule_Start(MODULE_HANDLE module)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)module;
RESTFUL_CONTEXT ctx = WA_InitRestful(module_data->broker, module, "mod-client");
WA_SetRemotePoster(ctx, job_poster, module_data);
module_data->restful_context = ctx;
ThreadAPI_Create(&module_data->threadHandle, client_WorkingThread, module_data);
ThreadAPI_Create(&module_data->threadHandle, client_HandlingThread, module_data);
}
函数job_poster
将消息转发至线程client_HandlingThread
所拥有的消息队列。dlist_node_try_process
会触发Response回调函数的执行。
static void job_poster (void * job, RemoteHandler job_handler, void * arg_for_poster)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)arg_for_poster;
dlist_post(module_data->internal_queue, T_Message_Handler, job, job_handler);
}
int client_HandlingThread(void *param)
{
E2E_MODULE_DATA* module_data = (E2E_MODULE_DATA*)param;
while(1)
{
dlist_node_t job = dlist_get_wait(module_data->internal_queue, 10);
if(job)
{
if(!dlist_node_try_process(job))
{
WARNING2("failed to process job!");
dlist_node_free(job);
}
}
}
return 0;
}