ActiveMQBytesMessage內容修改

讀寫分離分析

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
更多資料,請搜索公衆號歪歪梯Club

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章