使用 TNonblockingServerSocket 时 Thrift `recv failed` SocketException

Thrift `recv failed` SocketException when using TNonblockingServerSocket

我尝试在客户端和服务器端将 TNonblockingServerSocketTFramedTransport 一起使用,但出现以下错误: TTransportException: java.net.SocketException: Software caused connection abort: recv failed.

服务器代码:

TServerTransport serverTransport = new TNonblockingServerSocket(9090);
TThreadPoolServer.Args args = new TThreadPoolServer.Args(serverTransport);
args.processor(processor);
args.transportFactory(new TFramedTransport.Factory());
TServer server = new TThreadPoolServer(args);
server.serve();

客户代码:

transport = new TSocket("localhost", 9090);
transport.open();
TProtocol protocol = new  TBinaryProtocol(new TFramedTransport(transport));
Calculator.Client client = new Calculator.Client(protocol);

当切换回 TServerSocket 而不是 TNonblockingServerSocket 时一切正常 - 即使使用帧传输。

知道我在这里遗漏了什么吗?

我切换到 THsHaServer 而不是 TThreadPoolServer 并且一切正常。奇怪。

我仍然不知道为什么它不适用于 TThreadPoolServer :(

正如 JensG 在之前的评论中提到的,TNonblockingServerSocket 仅用于与 TNonblockingServer 一起使用。

理论上,此信息(以及其他一些类似信息)可以在 Java 的类型系统中进行编码。如果您有具体建议,可以在此处报告: https://issues.apache.org/jira/browse/THRIFT

在实践中,一些类型信息在 Java 的类型系统(或 C++ 的类型系统,或在此处插入随机语言)中编码可能太难或太繁琐。在这些情况下,通常最好通过文档或快速失败来解决问题。