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); // 注册接口
posted @ 2021-12-25 22:54  淡然那片天  阅读(328)  评论(0)    收藏  举报