TFramedTransport打开时,节点中的TNonblockingServer崩溃 [英] TNonblockingServer in thrift crashes when TFramedTransport opens

查看:2441
本文介绍了TFramedTransport打开时,节点中的TNonblockingServer崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在尝试在C ++中实现一个thrift服务器来与Python客户端通信。



这里是我的代码:



C ++服务器:

  shared_ptr< ThriftHandler> _handler(new myHandler()); 
shared_ptr< TProcessor> _processor(new myService(_handler));
shared_ptr< TProtocolFactory> _protocolFactory(new TBinaryProtocolFactory());
shared_ptr< ThreadManager> _threadManager = ThreadManager :: newSimpleThreadManager(15);
shared_ptr< PosixThreadFactory> _threadFactory(new PosixThreadFactory());
_threadManager-> threadFactory(_threadFactory);
_threadManager-> start();

shared_ptr< TNonblockingServer> _server(new TNonblockingServer(_processor,_protocolFactory,9090,_threadManager));;
_server-> serve();

Python客户端代码:

  transport = TSocket.TSocket(host,port)
transport = TTransport.TFramedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = MyService.Client (协议)
transport.open()
log.info(连接成功!)

当我启动服务器,然后客户端,我得到以下:



在客户端(Python):

  ./ myPythonExec.py 
连接成功!
socket.error:[Errno 104]由对等连接重置

在服务器端c ++):

 断言0失败
0 0x00007ffff0942425 in __GI_raise(sig =< optimized out>)at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
1 0x00007ffff0945b8b在__GI_abort()at abort.c:91
2 0x00007ffff093b0ee在__assert_fail_base(fmt =< optimized out> ,assertion = 0x7ffff1438f1a0,
file = 0x7ffff1439298src / server / TNonblockingServer.cpp,line =< optimized out> ;, function =< optimized out>)at assert.c:94
3 0x00007ffff093b192在__GI___assert_fail(assertion = 0x7ffff1438f1a0,file = 0x7ffff1439298src / server / TNonblockingServer.cpp,
line = 558,function = 0x7ffff1439c60void apache :: thrift :: server :: TNonblockingServer: :TConnection :: workSocket())at assert.c:103
4 0x00007ffff14336e4在apache :: thrift :: server :: TNonblockingServer :: TConnection :: workSocket(this = 0x7fffc0004ac0)
at src / server / TNonblockingServer.cpp:558
5 0x00007ffff11ed94c in event_base_loop()from /usr/lib/libevent-2.0.so.5

我使用libthrift 0.8.0和libthrift 0.9.1的相同的pb



它使用TSimpleServer on C ++和TBufferedTransport在客户端

解决方案

对不起,前面没有看到,但看起来像同样的问题:
使用Apache Thrift的服务多路复用



  shared_ptr< TTransportFactory> ; _transportFactory(new TFramedTransportFactory()); 
shared_ptr< TNonblockingServer> _server(
new TNonblockingServer(
_processor,
_transportFactory,
_transportFactory,
_protocolFactory,
_protocolFactory,
9090,
_threadManager ));
_server-> serve();


I've been trying to implement a thrift server in C++ to communicate with a Python client.

here is my code:

C++ server:

shared_ptr<ThriftHandler> _handler (new myHandler());
shared_ptr<TProcessor> _processor (new myService(_handler));
shared_ptr<TProtocolFactory> _protocolFactory (new TBinaryProtocolFactory());
shared_ptr<ThreadManager> _threadManager = ThreadManager::newSimpleThreadManager(15);
shared_ptr<PosixThreadFactory> _threadFactory(new PosixThreadFactory());
_threadManager->threadFactory(_threadFactory);
_threadManager->start();

shared_ptr<TNonblockingServer> _server(new TNonblockingServer(_processor, _protocolFactory, 9090 ,_threadManager));;
_server->serve();

Python Client code:

transport = TSocket.TSocket(host, port)
transport = TTransport.TFramedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = MyService.Client(protocol)
transport.open()
log.info("connection success!")

When I start the server and then the client, I get the following:

On the client side (Python):

./myPythonExec.py
connection success!
socket.error: [Errno 104] Connection reset by peer

On the server side (c++):

assertion " 0 " failed
0  0x00007ffff0942425 in __GI_raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
1  0x00007ffff0945b8b in __GI_abort () at abort.c:91
2  0x00007ffff093b0ee in __assert_fail_base (fmt=<optimized out>, assertion=0x7ffff1438f1a "0", 
file=0x7ffff1439298 "src/server/TNonblockingServer.cpp", line=<optimized out>, function=<optimized out>) at assert.c:94
3  0x00007ffff093b192 in __GI___assert_fail (assertion=0x7ffff1438f1a "0", file=0x7ffff1439298 "src/server/TNonblockingServer.cpp", 
line=558, function=0x7ffff1439c60 "void apache::thrift::server::TNonblockingServer::TConnection::workSocket()") at assert.c:103
4  0x00007ffff14336e4 in apache::thrift::server::TNonblockingServer::TConnection::workSocket (this=0x7fffc0004ac0)
at src/server/TNonblockingServer.cpp:558
5  0x00007ffff11ed94c in event_base_loop () from /usr/lib/libevent-2.0.so.5

I'm using libthrift 0.8.0 and have the same pb with libthrift 0.9.1

It works perfectly when using a TSimpleServer on C++ and a TBufferedTransport on the client side

解决方案

Sorry, have not seen earlier, but looks like the same issue: Service Multiplexing using Apache Thrift

In short, you have to use either framed on both sides, or none.

shared_ptr<TTransportFactory> _transportFactory(new TFramedTransportFactory());
shared_ptr<TNonblockingServer> _server(
   new TNonblockingServer(
     _processor, 
     _transportFactory,
     _transportFactory,
     _protocolFactory, 
     _protocolFactory, 
     9090,
     _threadManager));
_server->serve();

这篇关于TFramedTransport打开时,节点中的TNonblockingServer崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆