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编程的更多相关文章

  1. 使用任务Task 简化异步编程

    使用任务简化异步编程 Igor Ostrovsky 下载代码示例 异步编程是实现与程序其余部分并发运行的较大开销操作的一组技术. 常出现异步编程的一个领域是有图形化 UI 的程序环境:当开销较大的操作 ...

  2. 第十节:利用async和await简化异步编程模式的几种写法

    一. async和await简介 PS:简介 1. async和await这两个关键字是为了简化异步编程模型而诞生的,使的异步编程跟简洁,它本身并不创建新线程,但在该方法内部开启多线程,则另算. 2. ...

  3. 关于thrift的一些探索——thrift序列化技术

    thrift的IDL,相当于一个钥匙.而thrift传输过程,相当于从两个房间之间的传输数据. 图-1 (因为Thrift采用了C/S模型,不支持双向通信:client只能远程调用server端的RP ...

  4. 示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写

    原文:示例:WPF中自定义StoryBoarService在代码中封装StoryBoard.Animation用于简化动画编写 一.目的:通过对StoryBoard和Animation的封装来简化动画 ...

  5. 简化Java编程的法宝,让工作更高效

    如果你没有看过之前的文章,也不要紧,这并不影响你对接下来的内容的理解,不过为了照顾直接看到第二篇的同学,还是有必要介绍一下HuTool的引入方式. 在项目的pom.xml的dependencies中加 ...

  6. Thrift RPC实战(三) thrift序列化揭秘

    本文主要讲解Thrift的序列化机制, 看看thrift作为数据交换格式是如何工作的? 1.构造应用场景: 1). 首先我们先来定义下thrift的简单结构. 1 2 3 4 5 namespace ...

  7. NGK与Captain technology合作 推出贷款体验用于简化汽车经销商流程

    据外媒报导,近日,NGK.IO正在与Captain technology恰谈合作事宜,以简化购车体验,包括简化购车流程.NGK的CTO Stephen Litan表示:"NGK宣布与Capt ...

  8. Thrift RPC实战(二) Thrift 网络服务模型

    限于篇幅关系,在观察源码的时候,只列举了部分源代码 TServer类层次体系 TSimpleServer/TThreadPoolServer是阻塞服务模型 TNonblockingServer/THs ...

  9. Thrift入门初探(2)--thrift基础知识详解

    昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...

随机推荐

  1. json-lib使用笔记

    今天再来记录一款生成JSON的工具——json-lib,它比较与我之前使用的FastJSON来说,使用都是很简单的,但是要使用json-lib要需要的jar包可真不少,所需要的依赖jar有八九个之多, ...

  2. msyqld 的 The user specified as a definer ('root'@'%') does not exist 问题

    msyqld 的 The user specified as a definer ('root'@'%') does not exist 问题 造成问题:搭建网站时显示内容不完整. 跟踪tomcat日 ...

  3. openssh 在32位、64位操作系统上的安装配置

    openssh是安装在windows系统上的提供SSH服务的服务端软件,可以提供安全的命令行远程连接管理.下面介绍下openssh成功安装使用的操作步骤. 工具/原料   openssh window ...

  4. php效率优化

    php效率优化 最近在公司一边自学一边写PHP程序,由于公司对程序的运行效率要求很高,而自己又是个新手,一开始就注意程序的效率很重要,这里就结合网上的一些资料,总结下php程序效率优化的一些策略:1. ...

  5. POI-Excel表格导入和导出

    ExcelWriter /** * @author zuzhilong * @date 2013-10-10 下午08:04:02 * @desc 生成导出Excel文件对象 * @modify * ...

  6. Ryu控制器学习

    Ryu 在Mininet环境下实现Ryu为控制器控制ARP报文的实验中学习了Ryu相关的知识,记录如下 官方文档:http://ryu.readthedocs.io/en/latest/getting ...

  7. fatal error C1083: 无法打开包括文件:“iostream.h”: No such file or directory

    其实 <iostream.h>是c风格的,你可用,但注意格式:  要么是:  #include <iostream>  using namespace std; 在标准C++里 ...

  8. 认识单元测试(jar包资源网址:http://search.maven.org/)

    单元测试在3.8版本以前只需要导入一个jar包,3.8版本以后需要导入二个jar包.(网址:http://junit.org/junit4/) package com.huawei.junit; im ...

  9. 并发编程和MySQL总结

    1️⃣  并发编程主要内容: 操作系统工作原理介绍.线程.进程演化史.特点.区别.互斥锁.信号.事件.join.GIL.进程间通信.管道.队列. 生产者消费者模型.异步模型.IO多路复用模型.sele ...

  10. 微信小程序开发注意点和坑集

    开发(Tips)   避开频繁setData * 小程序端对于频繁的逻辑层和显示层的交互很不友好,特别是安卓机,与浏览器上js直接操作DOM不同,小程序通过逻辑更新显示层并不完全实时,开发者应避免出现 ...