码迷,mamicode.com
首页 > 其他好文 > 详细

深入剖析一条JMS消息(消息头)

时间:2014-10-26 14:27:43      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:des   io   ar   使用   java   sp   数据   on   amp   

一个Message对象有3个部分:消息头,消息属性,最后就是消息数据自身,它称为有效负载或消息体。消息能够携带重要的数据或仅仅用于系统中的事件通知。在大多数情况下,消息同时作为通知和携带数据的工具。下面我们先来说说消息头。

每条JMS消息都有一组标准的消息头。每个消息头都由一组取值函数和赋值函数方法所标识,这些方法名称紧跟在术setJMS<HEADER>(),getJMS<HEADER>()之后。下面是一个Message接口的部分定义,它显示了JMS消息头使用的所有方法:

public interface Message {
    public Destination getJMSDestination() throws JMSException;
    public void setJMSDestination(Destination destination) throws JMSException;
    public int getJMSDeliveryMode() throws JMSException
    public void setJMSDeliveryMode(int deliveryMode) throws JMSException;
    public String getJMSMessageID() throws JMSException;
    public void setJMSMessageID(String id) throws JMSException;
    public long getJMSTimestamp() throws JMSException‘
    public void setJMSTimestamp(long timestamp) throws JMSException;
    public long getJMSExpiration() throws JMSException;
    public void setJMSExpiration(long expiration) throws JMSException;
    public boolean getJMSRedelivered() throws JMSException;
    public void setJMSRedelivered(boolean redelivered) throws JMSException;
    public int getJMSPriority() throws JMSException;
    public void setJMSPriority(int priority) throws JMSException;
    public Destination getJMSReplyTo() throws JMSException;
    public void setJMSReplyTo(Destination replyTo) throws JMSException;
    public String getJMScorrelationID() throws JMSException;
    public void setJMSCorrelationID(String correlationID) throws JMSException;
    public byte[] getJMSCorrelationIDAsBytes() throws JMSException;
    public void setJMSCorrelationIDAsBytes(byte[] correlationID) throws JMSException;
    public String getJMSType() throws JMSException;
    public void setJMSType(String type) throws JMSException;
}

JMS消息头可以分为两大类:自动分配的消息头和开发者分配的消息头。

1. 自动分配的消息头

大多数JMS消息头是自动分配的,在传送消息时,消息头的值由JMS提供者来设置,因此开发者使用setJMS<HEADER>()方法分配的值就被忽略了。换句话说,对于大多数自动分配的消息头来说,使用赋值函数方法显然是徒劳的。不过,这并非意味着开发者无法控制这些消息头的值。一些自动分配的消息头可以在创建Session和MessageProducer(也就是TopicPublisher)时,由开发者通过编程方式来设置。这样的例子有JMSDeliveryMode和JMSPriority消息头,它们在随后的消息头定义中会有所解释。

JMSDeliveryMode

在JMS中,传送模式有两种类型:持久性模式和非持久性模式。一条持久性消息应该被传送“一次而且仅仅一次”,这就意味着如果JMS提供者出现故障,该消息并不会丢失; 它会在服务器恢复正常之后再次传送。一条非持久性消息最多只会传送一次,这意味着如果JMS提供者出现故障,该消息可能会永久丢失。在持久性和非持久性这两种传送模式中,消息服务器都不会将一条消息向同一消息者发送一次以上。

int deliverymode = message.getJMSDeliveryMode();
if(deliverymode = javax.jms.DeliveryMode.PERSISTENT) {        //持久化
    ......
}else {    //DeliveryMode.NON_PERSISTENT    非持久化
    ......
}

传送模式可以使用生产者(也就是 TopicPublisher 或 QueueSender)上的setJMSDeliveryMode()方法来设定。一旦为MessageProducer设置了传送模式,它就会应用到使用该生产者传送的所有消息上。默认设置为PERSISTENT(持久性):

//在消息生产者上设置JMS传送模式
TopicPublisher topicPublisher = topicSession.createPublisher(topic);
topicPubiisher.setDeliveryMode(DeliverMode.NON_PERSISTENT);


深入剖析一条JMS消息(消息头)

标签:des   io   ar   使用   java   sp   数据   on   amp   

原文地址:http://my.oschina.net/fhd/blog/337394

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!