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,来进行接口的定义, ...
 
随机推荐
- hotplug_uevent机制_修改mdev配置支持U盘自动挂载学习笔记
			
1.接入U盘,看输出打印信息并分析 (1)输出信息 自动创建设备节点 (2)用ls命令查看 这里/dev/sda表示整个U盘,/dev/sda1表示这个U盘的第一个分区. (3)手动挂载,查看文件,手 ...
 - Java的Socket通信----通过 Socket 实现 TCP 编程之多线程demo(2)
			
JAVA Socket简介 所谓socket 通常也称作”套接字“,用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过”套接字”向网络发出请求或者应答网络请求. import java.io ...
 - Python 小知识点(6)--静态方法、类方法、属性方法
			
(1)静态方法-->-@staticmethod装饰类中方法 只是名义上归类管理, 实际上在静态方法里访问不了类或实例中的任何属性 class Dog(object): def __init__ ...
 - 如何查找EI 及SCI 索引
			
1.EI https://www.engineeringvillage.com/search/quick.url 搜题目,然后点击搜索,然后点击细节(detailed) Accession numbe ...
 - C# Graphics中有关绘图质量的几个Mode
			
一.CompositingMode 获取一个值,该值指定如何将合成图像绘制到此 Graphics.复合模式确定从源映像的像素是覆盖(SourceCopy)还是组合(SourceOver, 需要使用半透 ...
 - 跟我学算法-SVM(支持向量机)
			
支持向量机是一个点离决策边界越近,离决策面越远的问题 求解的过程主要是通过拉格朗日乘子法,来求解带约束的优化问题,在问题中涉及两个方面,一个是线性的,一个是非线性的,非线性的有 我们平时比较常见的高斯 ...
 - Spring -- <context:component-scan>使用说明
			
在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类 ...
 - Nginx 安装与使用
			
作者:吴秦出处:http://www.cnblogs.com/skynet/ 前言 nginx Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一 ...
 - PHP - 脚本退出(包括异常退出),执行指定代码
			
之前做聊天室的时候有那么个需求就是当用户异常断线的时候就应该清除她的在线状态.因为当时对于flush不够了解,尝试了各种办法,好像都没办法在我们开发机上面执行相应的代码.后来知道是flush的原因.我 ...
 - (转) iphone开发资源汇总
			
如何用Facebook graphic api上传视频: http://developers.facebook.com/blog/post/532/ Keychain保存数据封装: https://g ...