thrift异步c ++示例

时间:2017-05-28 03:11:43

标签: c++ asynchronous thrift

我查看了Apache Thrift发行版,并在apache.org网站上寻找一个例子,但我没有成功。

我希望有人指出异步客户端的示例实现 经典Apache Thrift中的非阻塞服务器(不是来自的新分支) Facebook),使用“--gen cpp”。

我可以看到标题为“apache thrift C ++异步客户端”的类似问题,但答案并未包含所有部分。

我想查看“.thrift”文件,然后是填写的服务器,以及相应的客户端代码。

我真的很想相信有人这样做了,而我就像我认为的那样不是一个好用户。

据我所知,Facebook版本(fbthrift)旨在帮助做得更好,但我对这个版本看起来多么不稳定感到沮丧。如果有人能指出我没有每天修改的fbthrift的稳定版本,我可以认为这是另一种选择。

1 个答案:

答案 0 :(得分:2)

不确定异步客户端的含义,但我会尽力根据我的理解来回答这个问题。

如果是“异步客户端”,你的意思是在node.js中讨论async,其中执行遵循回调结构,AFAIK不是开源thrift的一部分。但是它可以在fbthrift中找到。 Facebook有许多工具与fbthrift一起使用,包括他们流行的开源C ++库folly。通过thrift C ++客户端接口调用其他thrift服务必须阻止。

这是我在尝试异步非阻塞服务器时开始使用的代码。希望它有所帮助!

<强> something.thrift

#!/usr/local/bin/thrift --gen cpp

namespace cpp something

service Something {
  i32 ping()
}

<强> SomethingServer.cpp

#include "gen-cpp/Something.h"
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/server/TThreadedServer.h>
#include <thrift/server/TNonblockingServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/concurrency/ThreadManager.h>

#include <iostream>

using std::cout;
using std::endl;

class SomethingHandler : virtual public something::SomethingIf {
public:
    SomethingHandler() {
        cout << "Initialized" << endl;
    }

    int32_t ping() override {
        // Your implementation goes here
        cout << "Ping!" << endl;
        return 1;
    }
};

int main(int argc, char **argv) {
    using namespace ::apache::thrift;
    using namespace ::apache::thrift::protocol;
    using namespace ::apache::thrift::transport;
    using namespace ::apache::thrift::server;
    using namespace ::apache::thrift::concurrency;
    using boost::shared_ptr;
    using namespace ::something;

    int port = 9090;
    shared_ptr<SomethingHandler> handler(new SomethingHandler());
    shared_ptr<TProcessor> processor(new SomethingProcessor(handler));
    shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

    // using thread pool with maximum 15 threads to handle incoming requests
    shared_ptr<ThreadManager> threadManager
        = ThreadManager::newSimpleThreadManager(15);
    shared_ptr<PosixThreadFactory> threadFactory
        = shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
    threadManager->threadFactory(threadFactory);
    threadManager->start();

    TNonblockingServer server(processor, protocolFactory, port, threadManager);
    server.serve();

    return 0;
}

<强> SomethingClient.cpp

#include "Something.h"

#include <thrift/transport/TSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/protocol/TBinaryProtocol.h>

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

using namespace Test;

int main(int /* argc */, char** /* argv */) {
  boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
  boost::shared_ptr<TTransport> transport(new TFramedTransport(socket));
  boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));

  SomethingClient client(protocol);
  transport->open();
  for (auto i = 0; i < 10000; ++i) {
      client.ping();
  }
  transport->close();

  return 0;
}