Apache Thrift:在C ++中自动打开和关闭传输

时间:2013-07-11 19:40:14

标签: thrift thrift-protocol

背景:我有许多小型c ++程序都使用相同的静态库。我现在将thrift实现为中间层,这样我就可以在静态库的不同计算机上运行小型c ++程序。我不能改变c ++程序,所以我正在创建一个看起来像原始的“假”静态库,但实际上是一个调用真实静态库的thrift客户端。

问题:如何创建静态库,以便c ++程序在打开库时自动打开套接字,并在程序退出时关闭套接字?

通常,thrift客户端使用main方法在开头打开套接字并在最后关闭它。我可以让库在每个方法调用之前检查套接字是否打开,但我不知道如何关闭套接字。将它打开是否有任何问题?

1 个答案:

答案 0 :(得分:1)

一种方法可能是使用单个本地静态实例在库中创建C ++类。由于实例将在第一次调用时构造并在卸载时被销毁,因此您可以使用构造函数/析构函数进行连接和断开连接,如下所示:

#include <boost/shared_ptr.hpp>
#include <thrift/transport/TSocket.h>
#include <thrift/protocol/TBinaryProtocol.h>
#include "gen-cpp/mySvc.h"                  

using namespace apache::thrift::transport;  
using namespace apache::thrift::protocol;   

class ThriftProxy {
public:
    ThriftProxy() :
        trans(new TSocket("myhost", 8585)),
        proto(new TBinaryProtocol(trans)),
        client_(proto)
    {
        trans->open();
    }

    ~ThriftProxy()
    {
        trans->close();
    }

    static mySvcClient & client() 
    {
        static ThriftProxy proxy;
        return proxy.client_;
    }    

private:
    boost::shared_ptr<TSocket> trans;
    boost::shared_ptr<TProtocol> proto;
    mySvcClient client_;
};

然后lib中的函数可以使用ThriftProxy :: client()方法调用Apache Thrift服务器:

int exportedFunc(int i) {
    return ThriftProxy::client().myRPCFunc(i);
}

注意:在大多数情况下,将TBufferedTransport或TFramedTransport添加到I / O堆栈是减少对网络的小写入的好主意。留在这里以保持示例简单。