C++插件类
注册一个插件
#define NS_SCORER_PLUGIN_REGISTER(name, cls) CTOOL_PLUGIN_REGISTER(ns::SearchScorerPluginMgr, name, cls)
search scorer插件
class SearchScorerPlugin : public Plugin {
public:
// 信息初始化
bool Init() { return true;}
virtual bool Init(RankParam *rank_param, pugi::xml_node &instance_node) {
const char *instance_name = instance_node.attribute("name").value();
name_ = string(instance_name);
const char *output_key = instance_node.attribute("output_key").value();
output_key_ = string(output_key);
return LoadConfig(rank_param, instance_node);
}
// 加载配置文件
virtual bool LoadConfig(RankParam *rank_param, pugi::xml_node &instance_node) = 0;
// 获取ScorerParam
virtual ScorerParam *GetScorerParam(SearchSession *session) {
ScorerParam *param = new ScorerParam(session);
return param;
}
// query预处理
virtual bool ProcessQuery(SearchSession *session, ScorerParam *param) {
return true;
}
// 打分+输出
virtual double ProcessDoc(s::DocValue *doc, ScorerParam *param, int index) {
double score = CalScore(doc, param, index);
if (output_key_.length() > 0) {
doc->SetParam(output_key_, score);
}
return score;
}
// 打分
virtual double CalScore(s::DocValue *doc, ScorerParam *param, int index) = 0;
protected:
string name_;
string output_key_;
};
typedef PluginMgr<SearchScorerPlugin> SearchScorerPluginMgr;
使用scorer插件
scorer_ = SearchScorerPluginMgr::GetInstance()->NewInstance(string(scorer_name));
return scorer_->Init(rank_param, instance_node);
注册插件宏定义
#define CTOOL_PLUGIN_REGISTER(mgr_name, name, cls) \
class RegisterPlugin##name##cls { \
public: \
RegisterPlugin##name##cls () { \
mgr_name::GetInstance()->Register(#name, new cls); \
} \
}; \
RegisterPlugin##name##cls ___g_cRegisterPlugin##name##cls; \
插件基础类
class Plugin {
public:
virtual bool GlobalInit() {return true;} // 全局初始化,进程级,在注册插件时调用
virtual bool Init() {return true;} // 插件初始化接口
virtual void Reset() { } // 重置本插件中间结果
virtual Plugin *NewInstance() = 0; // 创建一个新的插件
};
插件管理器
template<class _Tp>
class PluginMgr {
// 获取新实例
_Tp *NewInstance(string name) {
string temp_name = strings::ToLowerCase(name);
typename map<string, _Tp *>::iterator itr = class_map_.find(temp_name);
if (itr != class_map_.end()) {
_Tp *tp = (_Tp *) itr->second->NewInstance();
if (tp->Init()) {
// 这里要实始化
return tp;
}
delete tp;
}
return NULL;
}
// 获取所有注册名
CStringList GetAllName() {
CStringList name_list;
typename map<string, _Tp *>::iterator itr = class_map_.begin();
for (; itr != class_map_.end(); itr++) {
name_list.push_back(itr->first);
}
return name_list;
}
// 注册插件
void Register(string name, _Tp *cls) {
string temp_name = strings::ToLowerCase(name);
ScopeLock scope_lock(lock_);
class_map_[temp_name] = cls;
}
// 全局初始化
bool GlobalInit() {
ScopeLock scope_lock(lock_);
typename map<string, _Tp *>::iterator itr = class_map_.begin();
for (; itr != class_map_.end(); itr++) {
if (!itr->second->GlobalInit()) { return false; }
}
return true;
}
// 获取单例
static PluginMgr<_Tp> *GetInstance() {
static SingletonHolder<PluginMgr<_Tp> > inst;
return inst.Get();
}
protected:
SpinLock lock_; // 锁
map<string, _Tp *> class_map_; // 类型和实例指针map
};
rpc处理
rpc消息处理者接口类
整个服务器中一个实例
继承类实现时需要注意:实现类必须线程安全,有可能多个线程会同时调用ProcessRpcRequest
RpcServer::CallProcessor(RpcRequest &rpc_request, RpcResponse &rpc_response)
string request_name = rpc_request.GetName(); // 获取请求接口名
specify_processor_map_.find(request_name, rpc_processor) // 从map中获取消息处理器
bool ret = rpc_processor->ProcessRpcRequest(rpc_request, rpc_response); // 处理rpc
class SearchSrvRpcProcessorWapper : public RpcProcessor {
public:
SearchSrvRpcProcessorWapper(SearchSrvPlugin *plugin);
virtual ~SearchSrvRpcProcessorWapper();
bool ProcessRpcRequest(RpcRequest &in_rpc_request,
RpcResponse &out_rpc_response);
protected:
SearchSrvPlugin *plugin_;
};
注册自定义服务
CStringList name_list = SearchSrvPluginMgr::GetInstance()->GetAllName();
for () {
query_rpc_server_->RegisterSpecifyProcessor( name_list[i], new SearchSrvRpcProcessorWapper(SearchSrvPluginMgr::GetInstance()->NewInstance(name_list[i])),true);}
服务插件管理类
#define NS_SRV_PLUGIN_REGISTER(name, cls) CTOOL_PLUGIN_REGISTER(ns::SearchSrvPluginMgr, name, cls)
class SearchSrvPlugin : public Plugin {
public:
enum PluginType {
kSearchSrvPluginTypeJson = 1,
kSearchSrvPluginTypeBuff
};
virtual PluginType Type() = 0;
void SetResponseDocument(rapidjson::Document *document) {plugin_var_.Get()->document_ = document;}
rapidjson::Value &GetResponseRoot() { return *plugin_var_.Get()->document_;}
protected:
ThreadLocal<SearchSrvJsonPluginVar> plugin_var_;
};
typedef PluginMgr<SearchSrvPlugin> SearchSrvPluginMgr;
自定义处理zk接口服务类
class ZkListSrvPlugin : public SearchSrvJsonPlugin {
public:
virtual bool Process(RpcRequest &rpc_request, rapidjson::Value &response, rapidjson::Value::AllocatorType &allocator); // 处理接口
virtual Plugin *NewInstance() {return new ZkListSrvPlugin();}
};
NS_SRV_PLUGIN_REGISTER(zklist, ZkListSrvPlugin); // 注册接口
浙公网安备 33010602011771号