3 消息類型
JAVA消息服務定義了6種JMS提供者必須支持的Message接口類型。儘管JMS定義了Message接口,但它並未定義它們的實現方式。這就允許提供者以它們自己的方式實現和傳送消息,同時爲JMS應用程序開發者維護了一個兼容的標準接口。這6個消息接口是Message和它的5個子接口:TextMessage、StreamMessage、MapMessage、ObjectMessage和ByteMessage。
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保持了寫入流時的順序和原始數據類型,因此它適用於形式轉換規則。