1. 程式人生 > >記錄一次thrift傳輸binary型別遇到的問題

記錄一次thrift傳輸binary型別遇到的問題

問題描述:

專案中使用thrift作為rpc框架,其中構建的一個服務的介面中使用到了binary型別,也就是位元組陣列。在thrift生產的java程式碼中,binary實際上被對映為nio的ByteBuffer型別。使用時一般是利用ByteBuffer.wrap方法將byte[]包裝成ByteBuffer物件,然後傳到介面方法中。在除錯過程中發現接收端接收到的ByteBuffer內容和傳送端的不一致,在反序列化時報錯:include invalid tag(zero)。

解決方法:很顯然,這個問題是由於thrift在傳輸binary型別時做了一些額外工作,改變了報文內容(在頭尾加了一些內容)。網上關於這個問題的資料比較少,自行debug,在這個過程中我注意到接收端ByteBuffer比傳送端多了很多位元組,並且limit-position的值與傳送端位元組數一樣,於是我猜測position到limit之間的位元組應該就是真正傳送的報文。於是將傳送端的ByteBuffer的內容copy下來,然後將接收端的ByteBuffer內容copy下來,用beyondCompare作比較,果然是一致的。然後在程式碼中對接收端接收到的ByteBuffer做一些處理:Arrays.copyRange(byteBuffer.array(), byteBuffer.position(), byteBuffer.limit()), 拿到實際有用的報文,問題解決!!