框架总体结构:

通过配置组件到集成框架,快速组装出产品。
加载流程:
框架按照集成配置文件加载组件。通过名称找到组件描述表和可执行文件,通过多进程方式运行组件。时序图

客户端集成框架在启动和加载组件之后,会与每一个组件建立一个双工模式的有名管道。框架管理模块会将组件ID、进程ID、管道ID组装成一张组件进程映射表。用于通信过程中的组件寻址。总线或者其他模块需要寻址时可通过进程映射表找到对应的组件通信管道。
消息通信
请求模式

时序图如下: 以组件B调用组件A的发布接口为例子:

订阅发布模式
bool lpcInit() 初始化组件ID,
链接服务器ServerFrameWork,
设置LPC回调。 初始化http客户端及通信加密示例。
其他模块收到 common层定义的url 及方法。在回调里面接收到 LPCCallBackData
获取回调数据中的Url,Method,Protocol
IVMS_LOG_INFO("Recevice Callback Data.Url:[%s],Method:[%s],Protocol:[%s]", strUrl.c_str(), strMethod.c_str(), strProtocol.c_str());
if (!strUrl.empty()) // 内外部协议
{
// 创建内外部协议处理任务
auto pTask = new CHttpTask(strUrl, strMethod, struData);
if (pTask != nullptr)
{
if (!comm_method::CThreadPoolForNetTask::Instance().PostTask(pTask))
{
IVMS_LOG_ERROR("Failed To Post Net Task.Url:[%s],Method:[%s].", strUrl.c_str(), strMethod.c_str());
}
}
}
else
{
if (protocol::kWebSocket == strProtocol) // websocket通知
{auto pTask = new CWebsocketTask(struData);}
if (pTask != nullptr) { comm_method::CThreadPoolForInnerTask::Instance().PostTask(pTask); }
}
else {auto pTask = new CLpcTask(struData);}
/** @class CThreadPoolForNetTask* @brief 执行网络任务的线程池*/
class CThreadPoolForNetTask : public CThreadPoolDelegateModel, public Base::CSingleton<CThreadPoolForNetTask>
{
friend class Base::CSingleton<CThreadPoolForNetTask>
CThreadPoolForNetTask() {}
public: ~CThreadPoolForNetTask() {}
};
网友评论