停止一个Thrift服务器(TSimpleServer)
Stopping a Thrift server(TSimpleServer)
我有一个简单的用例,用于节俭服务器(TSimpleServer
),其中我有几个线程派生(除了主线程)。其中一个新生成的线程进入Thrift事件循环(即server.serve()
)。在主线程中收到信号后,我调用server.stop()
,这导致了下面发布的错误。
起初我以为这是一个未被捕获的异常。然而,将server.serve()
和server.stop()
的调用都包装在try-catch
的代码中并不能帮助隔离问题。有什么想法/建议(关于我应该做什么)吗?大多数Thrift教程/指南/示例似乎都在谈论服务器启动,但似乎没有提到停止场景,在这方面的任何指针/最佳实践/建议将是伟大的。谢谢。
同样,我使用的是thrift-0.7.0。
错误详细信息:
Thrift: Fri Nov 18 21:22:47 2011 TServerTransport died on accept: TTransportExc
eption: Interrupted
*** glibc detected *** ./build/mc_daemon: munmap_chunk(): invalid poi
nter: 0x0000000000695f18 ***
Segmentation fault (core dumped)
这里还有堆栈跟踪:
#0 0x00007fb751c92f08 in ?? () from /lib/libc.so.6
#1 0x00007fb7524bb0eb in apache::thrift::server::TSimpleServer::serve (
this=0x1e5bca0) at src/server/TSimpleServer.cpp:140
#2 0x000000000046ce15 in a::b::server_thread::operator() (
this=0x695f18)
at /path/to/server_thread.cpp:80
#3 0x000000000046c1a9 in boost::detail::thread_data<boost::reference_wrapper<a
ds::data_load::server_thread> >::run (this=0x1e5bd80)
at /usr/include/boost/thread/detail/thread.hpp:81
#4 0x00007fb7526f2b70 in thread_proxy ()
from /usr/lib/libboost_thread.so.1.40.0
#5 0x00007fb7516fd9ca in start_thread () from /lib/libpthread.so.0
#6 0x00007fb7519fa70d in clone () from /lib/libc.so.6
#7 0x0000000000000000 in ?? ()
编辑1:我已经为主线程,节俭服务器线程和后台线程添加了伪代码。
编辑2:我似乎已经解决了原来的问题,正如我在下面的回答中所指出的那样。然而,这种解决方案导致了两个相当不受欢迎/有问题的设计选择:(i)我必须引入一个thrift端点来启用一种机制来停止服务器(ii) thrift服务的处理程序类(通常需要实例化一个服务器对象)现在需要一种向服务器发送信号以停止的方法,引入了各种循环依赖。对这些设计问题/选择的任何建议都将是非常感谢的。
我的问题似乎源于我的代码/设计,其中我在主线程中调用了服务器上的stop
,这是在"服务器线程"中启动的。更改此行为(如pastebin代码片段中所述)有助于解决此问题。
相关文章:
- 如何强制 Thrift 仅接受来自本地主机的连接
- Cpp 未定义引用 'Apache:: thrift:: transport:: TSocket:: TSocket (std:: string const&, int)'
- Apache Thrift服务器作为客户端
- Apache Thrift C++服务器超时客户端连接
- 在 C++ 中将序列化的 Thrift 结构序列化为 Kafka
- Apache Thrift 是否保证数据完整性
- 在Thrift中,有没有一种方法可以避免生成C++setter
- Apache Thrift:终止来自服务器的连接
- 了解Apache Thrift与TCP套接字服务器的特征
- Apache Thrift, Thread Safe TSimpleServer stop() call
- Java Thrift Client and Binary data
- 你能用Apache Thrift代替JNI吗?
- 编译C 应用程序(Apache Thrift)时出错
- 以下错误的原因是什么?我们在编译 Thrift C++ 代码时收到此错误
- 协议缓冲区、Apache Thrift或任何其他数据结构序列化协议中的递归数据结构
- 如何在 Thrift 中检测服务器断开连接
- 在Apache Thrift中使用seqid的目的
- Thrift Java 客户端无法正确处理联合
- Apache Thrift 建立在 VxWorks 之上
- 停止一个Thrift服务器(TSimpleServer)