消息头的值由JMS提供者来设置,开发者setJMSXxx()分配的值忽略。
JMSDestination
消息头使用一个Topic 或 Queue 对象来标识目的地。
Topic destination = (Topic) message.getJMSDestination();
JMSDeliveryMode
在JMS 中,传送模式有两种类型:持久模式和非持久模式。
一条持久性消息应该被传送“一次而且仅仅一次”,这就意味着如果JMS 提供者出现故障,该消息并不会丢失,它会在服务器恢复正常之后再次传送。
一条非持久性消息最多只会传送一次,这意味着如果JMS 提供者出现故障,该消息可能会永久丢失。
在持久性和非持久性这两种传递模式总,消息服务器都不会将一条消息向同一消费者发送一次以上。
int deliveryMode = message.getJMSDeliveryMode();
if (deliveryMode == DeliveryMode.PERSISTENT) {...
} else {...
}
传送模式可以使用生产者(TopicPublisher 或 QueueSender)的 setJMSDeliveryMode() 方法来设定。默认为PERSISTENT
// 在消息生产者上设置JMS 传送模式
TopicPublisher topicPublisher = topicSession.createPublisher(topic);
topicPublisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
JMSMessageID
JMSMessageID 是一个String 类型的值,它唯一地标识了一条消息。至于标识符是如何实现唯一的,这取决于厂商。
String messageId = message.getJMSMessageID();
JMSTimestamp
JMSTimestamp 由 MessageProducer 在调用send() 操作时自动设置。它包含的是JMS 提供者接收消息的时间,而不是该消息实际传送的时间。
long timestamp = message.getJMSTimestamp();
JMSExpiration
一个Mesage 对象的有效期(expiration date)用来防止把过期的消息传送给消费者。
long timeToLive = message.getJMSExpiration();
消息的有效期以毫秒为单位,使用setTimeToLive() 方法在生产者(TopicPublisher)上设置:
TopicPublisher topicPublisher = topicSession.createPublisher(topic);
// 将生存时间设置为1 小时(1000毫秒 * 60 * 60)
topicPublisher.setTimeToLive(3600000);
默认将timeToLive 设置为零(0),这表明该消息没有到期时间。
JMSRedelivered
JMSRedelivered 消息头表示该消息将被重新传送给消费者。如果消息被重新传送,JMSRedelivered 消息头就为 true,否则为 false。
boolean isRedelivered = message.getJMSRedelivered();
JMSPriority
消息优先级有两类:0~4级是普通优先级,而5~9级则是加急优先级。加急优先级的消息要比普通优先级的消息优先传送:
int priority = message.getJMSPriority();...TopicPublisher topicPublisher = topicSession.createPublisher(topic);
topicPublisher.setPriority(9);