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. JavaScript笔记——使用AJax

    在使用过JQuery之后,再来看JavaScript的Ajax实现就会觉得很麻烦,不过,最近使用到了,就记录一下吧 在JavaScript中Ajax的实现可以分为四步: 第一步 得到XMLHttpRe ...

  2. UISegmentedControl-iOS

    //建立UISegmentedControl的数组 NSArray *segmentedArray = [NSArray arrayWithObjects:@"线下培训",@&qu ...

  3. gil基本介绍

    一 引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native t ...

  4. 监控服务器所有用户的操作记录(测试只记录root用户)

    在linux系统的环境下,不管是root用户还是其它的用户只有登陆系统后用进入操作我们都可以通过命令history来查看历史记录,可是假如一台服务器多人登陆,一天因为某人误操作了删除了重要的数据.这时 ...

  5. Django的视图层

    HttpResquest对象: request属性: /* 1.HttpRequest.GET 一个类似于字典的对象,包含 HTTP GET 的所有参数.详情请参考 QueryDict 对象. 2.H ...

  6. NIO buffer 缓冲区 API

    package bhz.nio.test; import java.nio.IntBuffer; public class TestBuffer { public static void main(S ...

  7. RSA_JS_PHP加密解密

    root@DESKTOP-I4OIMJC /cygdrive/e/html/RSA_JS_PHP/openssl/bin # ./openssl.exe OpenSSL> genrsa -out ...

  8. 笔记-TCPCLIENT

    ]; private void ReceiveMessage() { try { tcpClient = );//创建TcpClient对象实例 } catch (Exception le) { } ...

  9. HttpServletResponse返回页面弹窗

    下载方法: @RequestMapping(value = "/download.htm") public void downLoadFile(String id,HttpServ ...

  10. JAVA中集合转数组遍历

    JAVA中集合的遍历的一种方法时集合转数组遍历,也是就调用Collection中的toArray(). 代码: public static void main(String[] args) {     ...