JMS的 Message消息头,消息体,消息属性(ActiveMQ)

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

消息头

每条JMS消息都有一组标准的消息头。每个消息头都由一组取值函数和赋值函数方法所标识,这些方法名称紧跟在术setJMSXXX(),getJMSXXXX()之后。下面是一个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消息头可以分为两大类:自动分配的消息头和开发者分配的消息头。
自动分配的消息头 无法使用 message.setJMSxxx(xxxx); 来指定。但是可以在MessageProducer的方法或者是消息发送的时候的 send方式来指定。

// 参数1:消息体,
//参数2:是否持久化,
//参数3:消息的优先级,
//参数4:消息的过期时间   
	    messageProducer.send(textMessage,DeliveryMode.PERSISTENT,4,10*1000)

自动分配的消息头

大多数JMS消息头是自动分配的,在传送消息时,消息头的值由JMS提供者来设置,因此开发者使用setJMS

()方法分配的值就被忽略了。换句话说,对于大多数自动分配的消息头来说,使用赋值函数方法显然是徒劳的。不过,这并非意味着开发者无法控制这些消息头的值。一些自动分配的消息头可以在创建Session和MessageProducer(也就是TopicPublisher)时,由开发者通过编程方式来设置。这样的例子有JMSDeliveryMode和JMSPriority消息头

  1. JMSDestination
    消息发送的目的地(队列或主题);创建消息时可以设置JMSDestination,但是在发送完成时其值会更新为发送方所指定的JMSDestination,也就是说发送前该字段会被忽略;当消息被消费时,该字段的值与在它被发送时(send方法)被设置的值是相同的;

  2. JMSDeliveryMode
    指明消息的传输模式,持久和非持久(默认是持久的)

    1. DeliveryMode.PERSISTENT:保证消息仅传一次,JMS Provider服务停止后消息不会丢失;(持久的)
    2. DeliveryMode.NON_PERSISTENT:消息最多传一次,消息会因JMS Provider停止后丢失;(非持久的)
  3. JMSExpriation
    一个Message对象的有效期用来防止把过期的消息传送给消费者。这对于那些数据仅在某一个时间段内有效的消息来说,是非常有用的:(不设置,系统默认是0,表示没有有效期)

    	// 5.创建消息生产者
        MessageProducer messageProducer = session.createProducer(queue);
        // 设置该消息的有效期,单位为毫秒,下面表示60秒
        messageProducer.setTimeToLive(1000 * 60);
    
  4. JMSPriority
    在传送一条消息时,消息生产者能够为该消息分配一个优先级。消息优先级共有两类:0~4级是普通优先级,而5~9级则是加急优先级。消息服务器能够利用一条消息的优先级,按优先次序将该消息传送给消息者:加急优先级的消息要比普通优先级的消息优先传送

  5. JMSMessageID
    JMSMessageID是一个String类型值,它唯一地标识了一条消息。

  6. JMSTimestamp
    JMSTimestamp由MessageProducer在调用send()操作时自动设置。它包含的是JMS提供者接收消息的时间,而不是该消息实际传送的时间。这条消息头用于确定发送消息和它被消费者实际接收的时间间隔。时间戳是一个以毫秒来计算的long类型时间值(自1970年1月1日算起)。

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

消息体

  1. TextMessage
    普通的字符串消息,包含一个String

    TextMessage textMessage = session.createTextMessage();
    textMessage.setText("字符串的消息内容");
    
  2. MapMessage
    一个map的消息类型,key是String 类型,值可以是各种类型,
    在这里插入图片描述
    如生产者代码:

    		MapMessage mapMessage = session.createMapMessage();
           mapMessage.setString("key1", "消息内容啊啊啊");
           mapMessage.setString("key02", "key02的消息体");
    

    消费者:

      // 5.创建消费者
            MessageConsumer consumer = session.createConsumer(queue);
            MapMessage receive = (MapMessage) consumer.receive();
            String key02 = receive.getString("key02");
            String key1 = receive.getString("key1");
            System.out.println(key1);
            System.out.println(key02);
    

    运行结果:

    消息内容啊啊啊
    key02的消息体
    
  3. ByteMessage
    二进制的数组消息,包含一个byte[]

  4. StreamMessage
    java数据流消息,用标准流操作来顺序的填充和读取

  5. ObjectMessage
    对象消息,包含一个可序列化的java对象

消息属性

  1. 如果要使用除消息头以外的值,还可以使用消息属性,

  2. 消息属性,对 识别,去重,重点标注的操作非要有用的方法

  3. 消息属性时什么:

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值