JMS消息机制使用Message接口处理消息。
消息类型:
StreamMessage:从流中读取的消息;
MapMessage:由多个“key-value”对组成的内容。
TextMessage:普通字符串消息。
ObjectMessage:该消息包含序列化的对象。
BytesMessage:该消息内容是原始的字节流。
WebLogic还对TextMessage进行了扩展,扩展出一种新的类型XMLMessage。
JMS消息结构:
标准的消息头:可扩展的消息属性:消息主体内容
消息头是通过Message接口的setter和getter方法来设置、获取,也可有MessageProduce接口的方法操作。
消息生产者可通过调用Message对象的setXxxProperty(java.lang.String name, xxx value)方法来为JMS消息增加属性,
消息消费者可调用Message对象的getXxxProperty(java.lang.String name)方法来读取JMS消息属性。
消息头名称 | 设置者 | 说明 |
---|---|---|
JMSCorrelationID | 应用程序 | 用于指定相关的ID,可设置为任意的字符串。使用场景:1、将请求消息中的JMSMessageID的值设置为效应消息中JMSCorrelationID的值,让其关联起来。2、将若干个相关联的消息连接在一起 |
JMSDeliveryMode | 生产者 | 指定消息的传递模式。用于标识消息是否为持久性消息 |
JMSDestination | 生产者 | 消息目的地的名称 |
JMSExpiration | 生产者 | 指定消息什么时候过期。默认0,永不过期。 |
JMSMessageID | 生产者 | 消息的唯一标识符,通常以“ID:”开头,其他字符应由服务器生成 |
JMSPriority | 生产者 | 消息的优先级别,支持0~9个优先级。默认是4 |
JMSRedelivered | 应用服务器 | 消息是否为重新传递的消息的旗标 |
JMSReplyTo | 应用程序 | 消息的回复地址 |
JMSTimestamp | 生产者 | 用于long型的整数值记录消息的发送时间 |
JMSType | 应用程序 | 开发者的自定义消息类型 |
消息的选择器:
JMS消息选择器的表达式是一个SQL-92的字符串表达式,该表达式由JMS消息头、消息属性和SQL-92比较运算符、逻辑运算符组成,该表达式的返回值必须是一个boolean值。
每个JMS消息消费者都可以指定一个消息选择器。
Session接口提供如下方法:
MessageConsumer createConsumer(Destiantion destination, String messageSelector)
MessageConsumer createConsumer(Destination destination, string messageSelector, boolean NoLocal)
e.g.
MessageConsumer receiver = session.createConsumer(destination, "JMSPriority > 4");
消息的临时目的:
JMS消息的临时目的使用场景:JMS消息生产者向JMS服务器发送消息时,将JMSReplyTo消息头设为临时目的,JMS消息消费者收到消息后,向该临时目的回送一个响应。
Session接口提供了如下方法创建临时目的:
TemporaryQueue createTemporaryQueue()
TemporaryTopic createTemporaryTopic()
使用方法:
生产者
TemporaryQueue tempDestination = session.createTemporaryQueue();
message.setJMSReplyTo(tempDestination);
...
tempDestination.delete();
消费者
Destination replyTo = message.getJMSReplyTo();
MessageProducer sender = session.createProducer(replyTo);
TextMessage replyMessage = session.createTextMessage();
replyMessage.setText("Hello!");
sender.send(replyMessage);