2014-09-18 3 views
4

C++에서 Apache Thrift 서버가 외부 이벤트를 처리하도록하려면 어떻게해야합니까? 내 자신의 이벤트 루프를 작성하고 차단하지 않고 Thrift 프로세스 보류중인 이벤트를 수동으로 만들고 싶습니다.Apache Thrift 외부 이벤트 루프

나는 이런 식으로 뭔가를 할 수 있도록하고 싶습니다 : 위에서

//... 
TSimpleServer server(processor, 
         serverTransport, 
         transportFactory, 
         protocolFactory); 

boost::asio::io_service io; 
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5)); 
t.async_wait(&onTimer); 

while (!finished) 
{ 
    server.poll(); 
    io.poll(); 
} 

를 루프, 나는이 많이있을 것입니다 실현하면서 낭비 바쁜 대기 대기중인 이벤트가없는 경우. 이것을 피하는 방법에 대한 제안?

+0

[TNonBlockingServer] (https://github.com/apache/thrift/blob/master/lib/cpp/src/thrift/server/TNonblockingServer.cpp)를 사용해 보셨습니까? – JensG

+0

"* wasetful 폴링을 피하는 방법에 대한 제안? *"- 물론. 투표하지 마십시오. – JensG

+0

TNonBlockingServer를 본 적이 있지만 폴링하는 방법이나 내 자신의 I/O 이벤트를 연결하는 방법을 알지 못합니다. 아무도 대답하지 않으면 나는이 문제에 좀 더 집중하고 내 자신의 질문에 대답하려고 할 것입니다. –

답변

2

내가 알 수있는 한 Apache Thrift는 Boost.Asio 또는 다른 외부 이벤트 루프와 상호 운용 할 수있는 기본 제공 방법이 없습니다.

실제로 Asio 기반 Thrift 클라이언트/서버를 작성할 수 있습니다. 그들은 대체하는 Asio 기반 클라이언트/서버를 마무리하고 유지하는 사람이 필요하는 것

THRIFT-579: Alternative ASIO based fully async client/server for C++

: 그들은 같은 노력하고 있습니다 (실험적인 코드) 진행중인 아파치 드리프트 JIRA 작업이 있습니다.

sample server program의 스 니펫에는 TAsioServerboost::asio::io_service으로 전달할 수있는 방법이 나와 있습니다.

int main(int argc, char **argv) { 
    boost::asio::io_service io_service; 

    boost::shared_ptr<protocol::TProtocolFactory> protocolFactory(new protocol::TBinaryProtocolFactory()); 
    boost::shared_ptr<CalculatorAsyncHandler> handler(new CalculatorAsyncHandler(io_service)); 
    boost::shared_ptr<TProcessor> processor(new CalculatorAsyncProcessor(handler)); 

    boost::shared_ptr<apache::thrift::async::TAsioServer> server(
            new apache::thrift::async::TAsioServer(
                 io_service, 
                 9090, 
                 protocolFactory, 
                 protocolFactory, 
                 processor)); 

    server->start(); // Nonblocking 
    io_service.run(); // Blocking 

    return 0; 
} 

자신의 TAsioServer을 사용하여, 하나의 예를 들어, boost::asio::serial_portboost::asio::deadline_timer 같은 boost::asio::io_service를 사용 할 수 있어야합니다.

+0

확인. 메일 링리스트에 게시물을 던지는 것이 좋습니다. 적어도 당신은 그 문제에 대해 더 자세히 논의 할 C++ 녀석을 찾을 수 있어야합니다. 아마 THRIFT-579가 견인력을 얻었 을까요? protobuf에 대해서 : RPC없이 Thrift 직렬화를 사용할 수 있습니다. 기지를 바꿀 필요가 없습니다 ;-) – JensG

+0

아직 Protobuf 나 Thrift 중 하나에 헌신하지는 않았지만 아직 선택 사항이 열려 있습니다.THRIFT-579가 트렁크에 패치를 적용해야한다는 사실 (단순한 애드온이 아닌)이 아니라면 THRIFT-579를 제 자신의 Thrift 사용자 정의를위한 출발점으로 사용할 것입니다. 그러나 패치가 적용된 중고품에 만족하지 않습니다. THRIFT-579의 완성을 돕기 위해 자원 봉사를 고려할 수도 있지만, Protobuf를 기반으로 자신의 Asio 기반 RPC를 롤업하는 데 걸리는 시간보다 Thrift의 작동 방식을 완전히 이해하는 데 드는 시간 투자가 더 중요 할 수 있습니다. –