分散式訊息佇列ActiveMQ訊息模型(二)
在ActiveMQ中,一共支援4種訊息型別,分別是TextMessage訊息型別、BytesMessage訊息型別、ObjectMessage訊息型別,還有一種MapMessage訊息型別。
(1) TextMessage訊息型別
TextMessage訊息是一種最常用的文字訊息,這種訊息的使用最簡單。
在Producer端,直接在建立好的Session上建立一條TextMessage訊息即可,然後交給Producer進行傳送。具體如下:
在接收端,我們直接呼叫consumer的receiver方法,其中引數設定的是超時時間。因為我們設定的訊息確認方式的自動確認,也就是消費端(客戶端)收不到訊息會自動重發,直到消費端處理了這條訊息,發出確認,在Producer端才會刪除這條訊息。
(2) BytesMessage訊息型別
BytesMessage訊息是一種位元組碼訊息,它傳輸的是一個位元組陣列。使用上只要將我們的訊息變成一個位元組陣列即可,然後直接在producer端呼叫send方法傳送訊息即可。
在接收端,我們直接呼叫consumer的receiver方法,將接收到的內容儲存為BytesMessage型別的資料,然後通過類似於IO流的方式讀取出來即可(也可以儲存為位元組陣列,然後處理)。
(3) ObjectMessage訊息型別
這種訊息型別應用也很廣泛,使用這個型別的訊息,需要支援物件的序列化。在Java中,只要這個類實現了Serializable介面即可。
舉例來說明:我們建立一個訊息類,該類包含了一些欄位,比如在列車的基本資訊,定義了各個欄位的set/get方法,具體如下:
在Provider端,我們建立一個TrainBasicInfo物件,該物件就是一條訊息內容。將其轉換為ObjectMessage訊息進行傳送即可。
那麼在Consumer端呼叫consumer的Receive方法接收到ObjectMessage訊息,然後轉換為TrainBasicInfo物件進行獲取屬性值。
上面的訊息傳送和接收可以了。
思考1:上面的訊息傳送和接收可以了。但是有個問題,傳送端全部將訊息序列化為Object型別,如何在接收端知道要轉化為哪個訊息物件?
解決方案就是在傳送端傳送前,給該ObjectMessage加一個屬性,如下:
Obm.setIntProperty("msg_id",10001);
類似於一個鍵值對,每個訊息傳送前都設定一下這個,後面的值填寫這個訊息的msg_id即可。 程式碼如下:
在接收端先取這個屬性值,根據這個屬性值,我們就知道是哪個訊息,然後轉化為該物件進行提取屬性即可。
int msgId =obm.getIntProperty("msg_id");然後根據switch...case進行判斷即可。具體程式碼參考如下:
總結:
在ActiveMQ中,這三種訊息模式最常用。其實在企業中,大量的通訊案例都可以採用ObjectMessage訊息模型進行傳送和解析訊息。