3

Mac で Apache Thrift を使用して通信するクライアント プログラムとサーバー プログラムのペアを実行しています。私たちの実稼働システムでは、クライアントが使用TJSONProtocolし、サーバーがTBinaryProtocolシリアライゼーションとデシリアライゼーションを使用する状況になる可能性があります。

私はこれが恐ろしいことであることを知っています。しかし、これを事前に検出する方法がわかりません。サンプルプログラムを異なるプロトコルで試してみました。例外を受け取ることを期待していましたが、クライアントが RPC 呼び出しでスタックし、返されませんでした。

を使用したサーバーコードTBinaryProtocol:

shared_ptr<SomethingHandler> handler(new SomethingHandler());
shared_ptr<TProcessor> processor(new SomethingProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();

を使用したクライアント コードTJSONProtocol:

boost::shared_ptr < TSocket > socket(new TSocket(argv[1], 9090));
boost::shared_ptr < TTransport > transport(new TBufferedTransport(socket));
boost::shared_ptr < TProtocol > protocol(new TJSONProtocol(transport));
transport->open();
std::cout<<"Transport open success"<<std::endl;
SomethingClient client(protocol);
std::cout<<"Create client success"<<std::endl;
try{
    std::cout<<"About to ping"<<std::endl;
    client.ping(argv[2]);
    std::cout<<"Ping success"<<std::endl;
    }catch(TException e){
    std::cout<<"Exception occurred:"<<e.what()<<std::endl;
}
transport->close();

この例では、Ping success印刷することはありません。立ち往生せずにこの非互換性を検出する方法はありますか?

4

1 に答える 1