Thrift辅助类,用于简化Thrift编程
CThriftServerHelper用于服务端,CThriftClientHelper用于客户端。
IDL定义:
service PackageManagerService
{
}
服务端使用示例:
CThriftServerHelper<CPackageManagerHandler, PackageManagerServiceProcessor> _thrift_server_helper;
return _thrift_server_helper.serve(FLAGS_package_port, rpc_threads);
客户端使用示例:
CThriftClientHelper<PackageManagerServiceClient> thrift_client_helper(FLAGS_package_ip, FLAGS_package_port);
thrift_client_helper.connect(); // 注意需要处理异常TTransportException/TApplicationException/TException
#include <arpa/inet.h>
#include <thrift/concurrency/PosixThreadFactory.h>
#include <thrift/concurrency/ThreadManager.h>
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/server/TNonblockingServer.h>
#include <thrift/transport/TSocketPool.h>
#include <thrift/transport/TTransportException.h>
#include <thrift/async/TAsyncChannel.h>
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 ThriftHandler, class ServiceProcessor>
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<ThriftHandler> _handler;
boost::shared_ptr<thrift::TProcessor> _processor;
boost::shared_ptr<thrift::protocol::TProtocolFactory> _protocol_factory;
boost::shared_ptr<thrift::server::ThreadManager> _thread_manager;
boost::shared_ptr<thrift::concurrency::PosixThreadFactory> _thread_factory;
boost::shared_ptr<thrift::server::TServer> _server;
};
// 封装对thrift客户端的公共操作
template <class ThriftClient>
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<thrift::transport::TSocketPool> _sock_pool;
boost::shared_ptr<thrift::transport::TTransport> _socket;
boost::shared_ptr<thrift::transport::TFramedTransport> _transport;
boost::shared_ptr<thrift::protocol::TProtocol> _protocol;
boost::shared_ptr<ThriftClient> _container_client;
};
///////////////////////////////////////////////////////////////////////////////
template <class ThriftHandler, class ServiceProcessor>
bool CThriftServerHelper<ThriftHandler, ServiceProcessor>::serve(uint16_t port)
{
return serve("0.0.0.0", port, 1);
}
template <class ThriftHandler, class ServiceProcessor>
bool CThriftServerHelper<ThriftHandler, ServiceProcessor>::serve(uint16_t port, uint8_t num_threads)
{
return serve("0.0.0.0", port, num_threads);
}
template <class ThriftHandler, class ServiceProcessor>
bool CThriftServerHelper<ThriftHandler, ServiceProcessor>::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 = 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: " << tx.what();
return false;
}
LOG(INFO) << "container-thrift start";
return true;
}
template <class ThriftHandler, class ServiceProcessor>
void CThriftServerHelper<ThriftHandler, ServiceProcessor>::stop()
{
_server->stop();
}
///////////////////////////////////////////////////////////////////////////////
template <class ThriftClient>
CThriftClientHelper<ThriftClient>::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 = _sock_pool;
_transport.reset(new thrift::transport::TFramedTransport(_socket));
_protocol.reset(new thrift::protocol::TBinaryProtocol(_transport));
_container_client.reset(new ThriftClient(_protocol));
}
template <class ThriftClient>
CThriftClientHelper<ThriftClient>::~CThriftClientHelper()
{
close();
}
template <class ThriftClient>
void CThriftClientHelper<ThriftClient>::connect()
{
if (!_transport->isOpen())
{
_transport->open();
}
}
template <class ThriftClient>
void CThriftClientHelper<ThriftClient>::close()
{
if (_transport->isOpen())
{
_transport->close();
}
}
Thrift辅助类,用于简化Thrift编程的更多相关文章
- 使用任务Task 简化异步编程
使用任务简化异步编程 Igor Ostrovsky 下载代码示例 异步编程是实现与程序其余部分并发运行的较大开销操作的一组技术. 常出现异步编程的一个领域是有图形化 UI 的程序环境:当开销较大的操作 ...
- 第十节:利用async和await简化异步编程模式的几种写法
一. async和await简介 PS:简介 1. async和await这两个关键字是为了简化异步编程模型而诞生的,使的异步编程跟简洁,它本身并不创建新线程,但在该方法内部开启多线程,则另算. 2. ...
- 关于thrift的一些探索——thrift序列化技术
thrift的IDL,相当于一个钥匙.而thrift传输过程,相当于从两个房间之间的传输数据. 图-1 (因为Thrift采用了C/S模型,不支持双向通信:client只能远程调用server端的RP ...
- 示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写
原文:示例:WPF中自定义StoryBoarService在代码中封装StoryBoard.Animation用于简化动画编写 一.目的:通过对StoryBoard和Animation的封装来简化动画 ...
- 简化Java编程的法宝,让工作更高效
如果你没有看过之前的文章,也不要紧,这并不影响你对接下来的内容的理解,不过为了照顾直接看到第二篇的同学,还是有必要介绍一下HuTool的引入方式. 在项目的pom.xml的dependencies中加 ...
- Thrift RPC实战(三) thrift序列化揭秘
本文主要讲解Thrift的序列化机制, 看看thrift作为数据交换格式是如何工作的? 1.构造应用场景: 1). 首先我们先来定义下thrift的简单结构. 1 2 3 4 5 namespace ...
- NGK与Captain technology合作 推出贷款体验用于简化汽车经销商流程
据外媒报导,近日,NGK.IO正在与Captain technology恰谈合作事宜,以简化购车体验,包括简化购车流程.NGK的CTO Stephen Litan表示:"NGK宣布与Capt ...
- Thrift RPC实战(二) Thrift 网络服务模型
限于篇幅关系,在观察源码的时候,只列举了部分源代码 TServer类层次体系 TSimpleServer/TThreadPoolServer是阻塞服务模型 TNonblockingServer/THs ...
- Thrift入门初探(2)--thrift基础知识详解
昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...
随机推荐
- 反向生成hibernate实体类和映射文件
工欲善其事,必先利其器.我们可以使用IDE来根据数据库中的表反向生成实体类和映射文件,虽然这些东西手写也并不是难度很大,但是如果存在大量的简单工作需要我们做,也会显得很麻烦. 写在前面 我们反向生成的 ...
- 浅谈PHP面向对象编程(一、简介)
传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为“一个一个对象”的任务(功能),每个对象独自完成自 ...
- 我编辑的JAVA日历程序
class calendar { public static void main(String[]args) { int yearIn ; yearIn = Integer.parseInt(args ...
- 查看Unix/Linux的CPU个数和内存大小,系统位数(转载)
一.AIX 1.查看CPU数: (1) smtctl 从AIX5.3起,对于power5的机器,系统引入了SMT(Simultaneousmulti-threading)的功能,其允许两个处理线程在同 ...
- 把价钱转化为xx.xx的形式
把number类型转化为字符串类型let orderPayFeeStr = this.state.orderPayFee.toString();//商品价格转化为字符串if(orderPayFeeSt ...
- OD 实验(六) - 对一个程序的破解
程序: 双击进行安装,安装过程默认就好了 安装完成 运行程序 输入 User 为 sch01ar,点击 Create 点击 Log In 这里显示为未注册版本 看看未注册版本有哪些功能被限制 这里会显 ...
- 基于RabbitMQ的跨平台RPC框架
RabbitMQRpc protocobuf RabbitMQ 实现RPC https://www.cnblogs.com/LiangSW/p/6216537.html 基于RabbitMQ的RPC ...
- 【转】详解Data Binding 通过几个简单示例深入了解WinForm数据绑定特性
原文地址:http://www.cnblogs.com/lichence/archive/2012/02/17/2356001.html
- JS的常用开发框架有哪些?
JS的开发框架有哪些? Yui-ext 基于Yahoo UI的扩展包yui-ext是具有cs风格的web用户界面组件,能实现复杂的Layou布局,界面效果可以和backbase比美,而且使用纯Java ...
- Python小知识点(2)
1.简述Python的运行过程 在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件. 我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器 ...