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

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

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

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

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

  2. 消息头:

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


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消息之消息属性》


转载于:https://my.oschina.net/gently/blog/632408

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值