JMS(十三):深入剖析一条JMS消息之消息头

    回过头来看看这几天写的关于JMS的博文,还是觉得自己少了点理论方面的东西,虽然有百度这好东西,能够仿照他人的代码然后试试写自己的。 不过既然少了。那就在对自己狠点。。。 

  1. 深入剖析一条jms消息:

        Message消息是整个JMS规范最为重要的部分。一个JMS应用程序中的所有数据和时间都是使用消息进行通信的,同时其余部分也都在为消息传输服务。

         一个Message对象有三个部分: 消息头, 消息属性,消息数据自身(有效负载或消息体)。

  2. 消息头:

         每条JMS消息都有一组标准的消息头,每个消息头都由一组取值函数(accessor)和赋值函数(mutator)方法所标识。以下是一个Message接口的部分定义:  


  3. public interface Message{
        
            public int getJMSDeliveryMode() throws JMSException;
    public void setJMSDeliveryMode(int arg0) throws JMSException ;


    public Destination getJMSDestination() throws JMSException;
    public void setJMSDestination(Destination arg0) throws JMSException;

    public long getJMSExpiration() throws JMSException;
    public void setJMSExpiration(long arg0) throws JMSException;

    public String getJMSMessageID() throws JMSException;
    public void setJMSMessageID(String arg0) throws JMSException;

    public int getJMSPriority() throws JMSException;
    public void setJMSPriority(int arg0) throws JMSException;

    public boolean getJMSRedelivered() throws JMSException;
    public void setJMSRedelivered(boolean arg0) throws JMSException;

    public Destination getJMSReplyTo() throws JMSException;
    public void setJMSReplyTo(Destination arg0) throws JMSException;

    public long getJMSTimestamp() throws JMSException;
    public void setJMSTimestamp(long arg0) throws JMSException;

    public String getJMSType() throws JMSException;
    public void setJMSType(String arg0) throws JMSException;

    }


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

    2.1  自动分配的消息头:大多数JMS消息头是自动分配的。

            JMSDestination:

                消息头使用一个 Topic 或 Queue 对象来表示目的地,二者都是都是Destination类型。 eg:


    Topic destination = (Topic) message.getJMSDestination();

          

           JMSDeliveryMode:

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


            JMSMessageID:

                其是一个String类型的值,它唯一的标识了一条消息。它是仓库中的消息需要的唯一的索引:

     String messageid = message.getJMSMessageID();

           

           JMSTimestamp:

                由MessageProducer在调用send()操作时自动设置,它包含的是JMS提供者接受消息的时间,而不是该消实际传送时间,用于确定发送消息和它被消费者四级接受的时间间隔, 时间戳是一个以毫秒来计算的long类型时间值:


    long time = message.getJMSTimestamp();

           

         JMSExpiration:

                一个Message对象的有效期,用来防止把过期的消息传送给消费者。


    // 电子文档上就最后那么两句代码   害的我一步一步往上推  。。。 坑 。。。。

    //消息的有效期以毫秒为单位:
       long time = message.getJMSExpiration();

    Topic topic = new ActiveMQTopic("topicDes") ;
    TopicConnectionFactory factory = new ActiveMQConnectionFactory();
    TopicConnection topicConnection = factory.createTopicConnection();
    TopicSession topicSession= topicConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
    TopicPublisher tp =  topicSession.createPublisher( topic );
    //将生存时间设置为1小时
    tp.setTimeToLive(3600000);

               接下里,提供者将 time值添加到系统时间戳中,并对JMSExpiration进行设置,通过默认将 time设置为(0),这表名该消息没有到期,在消息发送出去之后, 任何直接通过编程方式来调用setJMSExpiration()方法都会被忽略。


            JMSRedelivered:

                这个消息头表示该消息将被重新传送给消费者。如果消息被重新传送,消息头就为true,否则就为false。如果一个消费者未能确认先前传送的消息,或者JMS提供者并不确定消费者是否已经接收到该消息时候,就可以将这条消息标记为重新发送:       

    boolean isR = message.getJMSRedelivered();

             JMSPriority:

                 消息分配优先级。 有普通优先级:0~4; 加急优先级: 5~9; 消息服务器能够利用消息的优先级,按优先次序将该消息传送给消费者,加急比普通优先传送:

    int p = message.getJMSPriority();
    
    // 设置优先级:
    topicPublisher.setJMSPriority(9);
        //在消息发送出去之后,任何直接通过编程方式调用该方法都将被忽略。

    

    2.2 开发者分配的消息头:有一些消息头必须在生产者传送该消息之前在Message对象上显示设置:

            JMSReplyTo:

                某些情况下,可能需要消费者对一条消息做出应答,而其标明了消费者应该应答的地址。

// 在以下情况: JMS消费者无需应答(颠倒了顺序)
message.setJMSReplyTo(topic);
...
message.getJMSReplyTo();

          

           JMSType:

                由JMS客户端设置的一个可选消息头,标识消息结构和有效负载的类型。 这个消息头并未指明正被发送的消息类型,而是JMS提供者使用的内部消息仓库中的一个条目。 ( 好吧,  这个看起来有点晕。。。。)


                                    下一篇:...... 《深入剖析一条JMS消息之消息属性》


你可能感兴趣的:(JMS(十三):深入剖析一条JMS消息之消息头)