JMS消息服務器——Message消息分析(2)

3 消息類型

JAVA消息服務定義了6種JMS提供者必須支持的Message接口類型。儘管JMS定義了Message接口,但它並未定義它們的實現方式。這就允許提供者以它們自己的方式實現和傳送消息,同時爲JMS應用程序開發者維護了一個兼容的標準接口。這6個消息接口是Message和它的5個子接口:TextMessageStreamMessageMapMessageObjectMessageByteMessage

3.1 Message

最簡單的消息類型是javax.jms.Message,它擔當了其他消息類型基接口(base interface)的角色。可按一下方式創建Message類型,並將它用作一條不含有效負載的JMS消息:

     //使用者發佈者創建併發送消息
       Message message = pubSession .createTextMessage();
       publisher.publish(message );
    //接受消息
       @Override
       public void onMessage(Message message) {

這種類型的消息僅僅包含了JMS消息頭和消息屬性,而且,它僅限用於事件通知,它僅用於事件通知。一個事件通知就是出現某些情況的一個廣播、告警或者通知。如果業務場景需要一個不含有效負載的簡單通知,輕量級消息類型就是實現它的最有效方式。
例如爲了廣播通知某個特定類中的一個異常,你可以發佈一條不含有效負載的異常文本消息,如下所示:

    //發送異常
    ...
    try{
    ...
    }catch(Exception up){
        Message message = Sesstion.createMessage();
        message.setStringProperty("Exception",up.getMessage());
        publisher.publish(message);
        throw up;
    }
    //接受異常
    ...
    public void onMessage(Message message){
    ...
    System.out.println("Exception:"+message.getStringProperty());
    ...
    }
    ...

3.2 TextMessage

文本消息可以使用Session接口中定義的兩個工廠方法之一來創建。其中一個工廠方法沒有使用參數,就會產生出不含有效負載的TextMessage對象。另一個工廠方法則使用一個string類型的有效負載作爲參數,生產出“準備就緒可傳送”的TextMessage對象:

    TextMessage textMessage = Session.createTextMessage();
    textMessage.setText("Hello World!");
    topicPublisher.publish(textMessage);
    ...
    TextMessage textMessage = session.createTextMessage("Hello!");
    queueSender.send(textMessage);

3.3 ObjectMessage

對象消息可以使用Session接口中的兩個工廠方法中的一個來創建。

    //訂單一個可序列化對象
    Order order = new Order();
    ...
    ObjectMessage objectMessage = Session.createObjectMessage();
    objectMessage.setObject(order);
    queueSender.send(objectMessage);
    ...
    ObjectMessage objectMessage = Session.createObjectMessage(order);
    topicPublisher.publish(objectMessage);

在消費者接受objectMessage時,它可以使用getObject()方法提取出有效負載。如果傳送的ObjectMessage不含有效負載,getObject()方法將返回一個null值。

    public void onMessage(Message message){
        try{
            ObjectMessage objectMessage =(ObjectMessage)message;
            Order order =(Order)objectMessage.getObject();
            ...
        }catch(JMSException jmse){
        ...
    }

注意:使用ObjectMessages時,消息生產者和消費者二者都必須是JMS兼容的。

3.4 BytesMessage

這種類型懈怠了一組原始類型字節流作爲有效負載。
它可以使用應用程序的本機格式來交換數據,這種格式可能不兼容其他現有的Message類型。當JMS純粹用於兩個系統之間的消息傳送時,也可以使用這種類型,而且該消息的有效負載對JMS客戶端來說是透明的。
如果你使用java.io.DataInputStream和java.io.DataOutputStream,那麼以這些I/O類爲基礎的ByteMessage接口方法,就會讓你覺得熟悉。

    BytesMessage bytesMessage = Session.createBytesMessage();

    bytesMessage.writeChar('R');
    byteMessage.writeInt(10);
    byteMessage.writeUTF("Hello");

消息響應

    public void onMessage(Message message){
        try{
            BytesMessage byteMessage =(BytesMessage)message;
            char c = byteMessage.readChar();
            int i = byteMessage.readInt();
            String s = byteMessage.readUTF();
        }catch(JMSException jmse){
        ....
        }
    }

ByteMessage是可移植性最好的而一種消息類型,因此他在於非JMS消息類型傳送客戶端通信時非常有用。有些情況下,一個JMS客戶端可以是一類路由器,它消費來自某個消息源的消息,並將他們傳送給一個目的地。路由選擇應用程序可能不需要知道它們傳輸的數據內容,並因此可以選擇使用ByteMessage將有效負載作爲二進制數據,從一個位置傳送到其他位置。

3.5 MapMessage

這種類型攜帶了一組鍵/值對作爲有效負載。有效負載類似與一個Java.util.Properties對象,除了有效負載值必須是Java原始數據類型和Strings型之外。
本質上,MapMessage的工作方式類似於JMS屬性:任何鍵/值對都可以寫入有效負載。其中名稱必須是一個String對象,而值則可以是String類型或原始數據類型。

    MapMessage mapMessage =Session.createMapMessage();
    mapMessage.setInt("Age",88);
    mapMessage.setFloat("Weight",234);
    mapMessage.setString("Name","Smith");
    mapMessage.setObject("Height",new Double(150.32));
    ...

    int age = mapMessage.getInt("Age");
    float weight = mapMessage.getFloat("Weight");
    String name = mapMessage.getString("Name");\
    Double height = (Double)mapmessage.getObject("Height");

3.6 StreamMessage

StreamMesage攜帶了一個Java原始數據類型流作爲有效負載。它提供了一套將格式化字節流映射爲Java原始數據類型的簡便方法。
StreamMessage保持了寫入流時的順序和原始數據類型,因此它適用於形式轉換規則。

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