讀寫分離分析
ActiveMQBytesMessage是activeMQ進行字節傳輸使用的消息類型,內部維護一個DataInputStream和一個ByteArrayInputStream,使用一個ByteSequence對象保存數據,保存時關閉寫操作,根據參數進行壓縮,涉及到讀寫分離,因此編寫本篇博客記錄。
1.新創建或者調用clearBody方法後的對象,處於只寫模式
2.處於只寫模式下的對象無法讀取數據,必須關閉只寫模式,進入只讀模式才能獲取已寫內容信息
3.只有處於只讀模式下的對象才能調用getBodyLength方法獲得數據長度,在寫結束前長度爲0
4.只能對只讀對象調用clearBody,會將保存的內容清空,並進入只寫模式
5.只能對只寫對象調用reset方法,會將字節流數據flush到字節緩存流,通過字節緩存流獲得ByteSequence對象保存數據,並關閉所有的輸入流,計算長度信息,之後可以通過getBodyLength方法獲得字節數據長度
獲得舊內容
當一個BytesMessage完成字節流的編寫後進入只讀模式,先獲得舊數據
byte[] bytes = new byte[(int) bytesMessage.getBodyLength()];
bytesMessage.readBytes(bytes);
寫入新內容
獲得舊數據後,既可以進行業務操作計算新的數據,然後需要調用clearBody清空舊內容進入可寫模式,再寫入新數據
bytesMessage.clearBody();
.....//業務計算
bytesMessage.writeBytes(newBytes)
結束輸入
寫入後一定要調用reset關閉輸入,進入只讀模式,然後纔會flush掉io管道中的所有數據並保存進入ByteSequence對象,如果沒有調用關閉輸入的消息直接生產到broker上,可能導致消費消息時出現下列bug:
1.getBodyLength方法返回值爲0
2.ByteSequence內容丟失
bytesMessage.reset()
更多文章,請搜索公衆號歪歪梯Club