在介紹使用原生ActiveMQ的API編程 我們使用的是最爲常見的TextMessage,除了這種類型外,我們在JMS和ActiveMQ安裝中還提到過MapMessage、BytesMessage、StreamMessage 和 ObjectMessage消息類型。
TextMessage
這裏我們就來簡單看一看其餘幾種消息類型的使用,這裏我們就在原來介紹使用原生ActiveMQ的API編程 例子上進行修改,首先是TextMessage,這種消息類型這裏就不重複介紹了,之前的例子就是,如下:
MapMessage
接下來我們就來介紹下MapMessage,如下:
我們在發送不同消息類型後,消息消費者這時就需要通過instanceof
來判斷下消息類型,然後再進行處理
異步消費消息的方式其實也一模一樣的,這裏就不贅述了。
BytesMessage
消息生產者發送消息如下:
消息消費者接受消息進行消費,如下:
ObjectMessage
ObjectMessage可以用來傳輸Java Bean對象,這裏肯定是需要進行序列化的,所以我們的Java Bean對象就必須要實現java.io.Serializable
接口
public class User implements Serializable{
private static final long serialVersionUID = 412718673804689450L;
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
然後再其餘的地方就沒有什麼特殊的了,和我們之前的使用方法類型
但是我們在Netty中,就曾介紹過Java本身序列化的缺點,比如效率低,產生的字節碼較大,所以一般不被推薦使用。
這裏我們就可以使用Netty中介紹過的幾種序列化框架,如protobuf,kyro,messgepack等,就可以將Java Bean轉化爲byte[]數組,然後就可以通過上述的 ByteMessage 來使用。
如果你覺得引入序列化框架也是比較麻煩的,那麼還可以使用JSON來解決,我們將Java Bean轉化爲json字符串來使用 TextMessage 來傳輸也是可以的。
StreamMessage
StreamMessage就比較類似於我們在網絡編程 中,使用的方式,如下:
這種方式我們一般使用較少,因爲這種方式下,如果我們消息內容變成改變,比如新增一個字段或減少一個字段,那麼我們在消息的發送和消費時,都需要做出對應的修改。