我有一个在Linux上运行的Java应用程序提供的Thrift API.我正在使用.NET客户端连接到API并执行操作.
对服务的前几次调用工作没有错误,但随后(看似随机)一个电话将"挂起".如果我强行退出我的客户端并尝试重新连接,该服务会再次挂起,或者我的客户端出现以下错误:
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at Thrift.Transport.TStreamTransport.Read(Byte[] buf, Int32 off, Int32 len)
(etc.)
Run Code Online (Sandbox Code Playgroud)
当我使用JConsole获取线程转储时,服务器已启用 accept()
"Thread-1" prio=10 tid=0x00002aaad457a800 nid=0x79c7 runnable [0x00000000434af000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
- locked <0x00000005c0fef470> (a java.net.SocksSocketImpl)
at java.net.ServerSocket.implAccept(ServerSocket.java:462)
at java.net.ServerSocket.accept(ServerSocket.java:430)
at org.apache.thrift.transport.TServerSocket.acceptImpl(TServerSocket.java:113)
at org.apache.thrift.transport.TServerSocket.acceptImpl(TServerSocket.java:35)
at org.apache.thrift.transport.TServerTransport.accept(TServerTransport.java:31)
at org.apache.thrift.server.TSimpleServer.serve(TSimpleServer.java:63)
Run Code Online (Sandbox Code Playgroud)
netstat在服务器上显示连接到服务端口,在TIME_WAIT强制退出客户端几分钟后,服务端口最终消失(正如预期的那样).
设置Thrift服务的代码如下:
int port = thriftServicePort;
String host = …Run Code Online (Sandbox Code Playgroud)