热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Thrift辅助类,用于简化Thrift编程

CThriftServerHelper用于服务端,CThriftClientHelper用于客户端。IDL定义:servicePackageManage
CThriftServerHelper用于服务端,CThriftClientHelper用于客户端。

IDL定义:
service PackageManagerService
{
}

服务端使用示例:
CThriftServerHelper _thrift_server_helper;
return _thrift_server_helper.serve(FLAGS_package_port, rpc_threads);

客户端使用示例:
CThriftClientHelper thrift_client_helper(FLAGS_package_ip, FLAGS_package_port);

thrift_client_helper.connect(); // 注意需要处理异常TTransportException/TApplicationException/TException

#include
#include
#include
#include
#include
#include
#include
#include using namespace apache;// 用来判断thrift是否已经连接,包括两种情况:
// 1.从未连接过,也就是还未打开过连接
// 2.连接被对端关闭了
inline bool thrift_not_connected(thrift::transport::TTransportException::TTransportExceptionType type)
{return (thrift::transport::TTransportException::NOT_OPEN == type)|| (thrift::transport::TTransportException::END_OF_FILE == type);
}// 封装对thrift服务端的公共操作
template
class CThriftServerHelper
{
public:// 启动rpc服务,请注意该调用是同步阻塞的,所以需放最后调用bool serve(uint16_t port);bool serve(uint16_t port, uint8_t num_threads);bool serve(const std::string& ip, uint16_t port, uint8_t num_threads);void stop();private:boost::shared_ptr _handler;boost::shared_ptr _processor;boost::shared_ptr _protocol_factory;boost::shared_ptr _thread_manager;boost::shared_ptr _thread_factory;boost::shared_ptr _server;
};// 封装对thrift客户端的公共操作
template
class CThriftClientHelper
{
public:CThriftClientHelper(const std::string& host, uint16_t port, int timeout = RPC_TIMEOUT);~CThriftClientHelper();void connect();void close();ThriftClient* operator ->() const{return _container_client.get();}ThriftClient* get(){return _container_client.get();}private:std::string _host;uint16_t _port;int _timeout;boost::shared_ptr _sock_pool;boost::shared_ptr _socket;boost::shared_ptr _transport;boost::shared_ptr _protocol;boost::shared_ptr _container_client;
};///template
bool CThriftServerHelper::serve(uint16_t port)
{return serve("0.0.0.0", port, 1);
}template
bool CThriftServerHelper::serve(uint16_t port, uint8_t num_threads)
{return serve("0.0.0.0", port, num_threads);
}template
bool CThriftServerHelper::serve(const std::string& ip, uint16_t port, uint8_t num_threads)
{try{_handler.reset(new ThriftHandler);_processor.reset(new ServiceProcessor(_handler));_protocol_factory.reset(new thrift::protocol::TBinaryProtocolFactory());_thread_manager &#61; thrift::server::ThreadManager::newSimpleThreadManager(num_threads);_thread_factory.reset(new thrift::concurrency::PosixThreadFactory());_thread_manager->threadFactory(_thread_factory);_thread_manager->start();_server.reset(new thrift::server::TNonblockingServer(_processor, _protocol_factory, port, _thread_manager));_server->serve();}catch (thrift::TException& tx){LOG(ERROR) <<"start thrift error: " <}template
void CThriftServerHelper::stop()
{_server->stop();
}///template
CThriftClientHelper::CThriftClientHelper(const std::string& host, uint16_t port, int timeout): _host(host), _port(port), _timeout(timeout)
{_sock_pool.reset(new thrift::transport::TSocketPool());_sock_pool->addServer(host, port);_sock_pool->setConnTimeout(timeout);_sock_pool->setRecvTimeout(timeout);_sock_pool->setSendTimeout(timeout);_socket &#61; _sock_pool;_transport.reset(new thrift::transport::TFramedTransport(_socket));_protocol.reset(new thrift::protocol::TBinaryProtocol(_transport));_container_client.reset(new ThriftClient(_protocol));
}template
CThriftClientHelper::~CThriftClientHelper()
{close();
}template
void CThriftClientHelper::connect()
{if (!_transport->isOpen()){_transport->open();}
}template
void CThriftClientHelper::close()
{if (_transport->isOpen()){_transport->close();}
}



转载于:https://www.cnblogs.com/aquester/p/9891605.html


推荐阅读
author-avatar
爱恨情仇4131_120
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有