作者发现,本文被多个博客和网站转发。赠人玫瑰,手有余香!
本文版权归作者和博客园共有,欢迎转载,转载请注明出处: https://www.cnblogs.com/buguge
【org.apache.thrift.TException家族】
【Thrift架构】
以下是thrift的客户端和服务端交互的一个原理图。可以看到遵循了rpc框架的传输层、协议层和应用层三层。本文提到的异常就是与这三层相对应的传输异常TTransportException(ConnectException、SocketTimeoutException)、协议异常TProtocolException和应用异常TApplicationException。
■ org.apache.thrift.transport.TTransportException: java.net.SocketException: Connection reset
既然是Connection reset,即“连接被重置”,从字面意思就可以判断出来,是连接的问题。那么,Thrift框架底层就是传输层,自然就是TTransport的问题了。什么问题呢?这个异常是由于client端指定的TTransport与服务端不一致导致的。demo中服务端是TFramedTransport,client端的TTransport实例是TSocket。
org.apache.thrift.transport.TTransportException: java.net.SocketException: Connection reset
at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:129)
at org.apache.thrift.transport.TTransport.readAll(TTransport.java:86)
at org.apache.thrift.protocol.TBinaryProtocol.readAll(TBinaryProtocol.java:425)
at org.apache.thrift.protocol.TBinaryProtocol.readI32(TBinaryProtocol.java:321)
at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:225)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:77)
at com.emaxcard.route.thrift.quickpay.TBatchPayQueryService$Client.recv_batchPayQuery(TBatchPayQueryService.java:61)
at com.emaxcard.route.thrift.quickpay.TBatchPayQueryService$Client.batchPayQuery(TBatchPayQueryService.java:48)
at com.emaxcard.ThriftTest.main(ThriftTest.java:38)
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:127)
... 8 more
■ org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: connect timed out
在执行transport.open()与服务端建立连接时,超时了。服务端响应时间超出了客户端设置的connectTimeout值。BTW,因为thrift多应用于局域网分布式系统,所以通常情况下不会出现连接超时,可能是所指定的服务压根儿就不存在(需检查IP和端口是否正确)
org.apache.thrift.transport.TTransportException: java.net.SocketTimeoutException: connect timed out
at org.apache.thrift.transport.TSocket.open(TSocket.java:226)
at com.emaxcard.ThriftTest.main(ThriftTest.java:30)
Caused by: java.net.SocketTimeoutException: c