使用 TNonblockingServerSocket 时 Thrift `recv failed` SocketException
Thrift `recv failed` SocketException when using TNonblockingServerSocket
我尝试在客户端和服务器端将 TNonblockingServerSocket
与 TFramedTransport
一起使用,但出现以下错误:
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++ 的类型系统,或在此处插入随机语言)中编码可能太难或太繁琐。在这些情况下,通常最好通过文档或快速失败来解决问题。
我尝试在客户端和服务器端将 TNonblockingServerSocket
与 TFramedTransport
一起使用,但出现以下错误:
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++ 的类型系统,或在此处插入随机语言)中编码可能太难或太繁琐。在这些情况下,通常最好通过文档或快速失败来解决问题。