JAVA消息服务定义了6种JMS提供者必须支持的Message接口类型。尽管JMS定义了Message接口,但它并未定义它们的实现方式。这就允许提供者以它们自己的方式实现和传送消息,同时为JMS应用程序开发者维护了一个兼容的标准接口。这6个消息接口是Message和它的5个子接口:TextMessage、StreamMessage、MapMessage、ObjectMessage和ByteMessage。
最简单的消息类型是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());
...
}
...
文本消息可以使用Session接口中定义的两个工厂方法之一来创建。其中一个工厂方法没有使用参数,就会产生出不含有效负载的TextMessage对象。另一个工厂方法则使用一个string类型的有效负载作为参数,生产出“准备就绪可传送”的TextMessage对象:
TextMessage textMessage = Session.createTextMessage();
textMessage.setText("Hello World!");
topicPublisher.publish(textMessage);
...
TextMessage textMessage = session.createTextMessage("Hello!");
queueSender.send(textMessage);
对象消息可以使用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兼容的。
这种类型懈怠了一组原始类型字节流作为有效负载。
它可以使用应用程序的本机格式来交换数据,这种格式可能不兼容其他现有的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将有效负载作为二进制数据,从一个位置传送到其他位置。
这种类型携带了一组键/值对作为有效负载。有效负载类似与一个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");
StreamMesage携带了一个Java原始数据类型流作为有效负载。它提供了一套将格式化字节流映射为Java原始数据类型的简便方法。
StreamMessage保持了写入流时的顺序和原始数据类型,因此它适用于形式转换规则。
原文地址:http://blog.csdn.net/caidaoqq/article/details/45955517