網上很多文章,都有各種涉及使用 oneway 的,基本是一個THRIFT IDL示例接口前面加 oneway。看完之后對
oneway的理解還是很模糊,於是看了下Thrift的代碼,終於搞懂了 oneway 。
代碼位置: org.apache.thrift.ProcessFunction#isOneway
1 try { 2 result = this.getResult(iface, args); 3 } catch (TException var9) { 4 LOGGER.error("Internal error processing " + this.getMethodName(), var9); 5 TApplicationException x = new TApplicationException(6, "Internal error processing " + this.getMethodName()); 6 oprot.writeMessageBegin(new TMessage(this.getMethodName(), (byte)3, seqid)); 7 x.write(oprot); 8 oprot.writeMessageEnd(); 9 oprot.getTransport().flush(); 10 return; 11 } 12 13 if (!this.isOneway()) { 14 oprot.writeMessageBegin(new TMessage(this.getMethodName(), (byte)2, seqid)); 15 result.write(oprot); 16 oprot.writeMessageEnd(); 17 oprot.getTransport().flush(); 18 }
原來開啟了 oneway ,一次RPC調用服務端不會返回response 給客戶端,也就相當於客戶端是忽略結果的一次調用。
默認這個 oneway 是false 的,也就是默認都會返回結果,業務上不關心調用結果的接口可以設置為 oneway,可以稍微提升接口性能。
