一个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
-
JMSDestination
消息发送的目的地(队列或主题);创建消息时可以设置JMSDestination,但是在发送完成时其值会更新为发送方所指定的JMSDestination,也就是说发送前该字段会被忽略;当消息被消费时,该字段的值与在它被发送时(send方法)被设置的值是相同的; -
JMSDeliveryMode
指明消息的传输模式,持久和非持久(默认是持久的)DeliveryMode.PERSISTENT
:保证消息仅传一次,JMS Provider服务停止后消息不会丢失;(持久的)DeliveryMode.NON_PERSISTENT
:消息最多传一次,消息会因JMS Provider停止后丢失;(非持久的)
-
JMSExpriation
一个Message对象的有效期用来防止把过期的消息传送给消费者。这对于那些数据仅在某一个时间段内有效的消息来说,是非常有用的:(不设置,系统默认是0,表示没有有效期)// 5.创建消息生产者 MessageProducer messageProducer = session.createProducer(queue); // 设置该消息的有效期,单位为毫秒,下面表示60秒 messageProducer.setTimeToLive(1000 * 60);
-
JMSPriority
在传送一条消息时,消息生产者能够为该消息分配一个优先级。消息优先级共有两类:0~4级是普通优先级,而5~9级则是加急优先级。消息服务器能够利用一条消息的优先级,按优先次序将该消息传送给消息者:加急优先级的消息要比普通优先级的消息优先传送 -
JMSMessageID
JMSMessageID是一个String类型值,它唯一地标识了一条消息。 -
JMSTimestamp
JMSTimestamp由MessageProducer在调用send()操作时自动设置。它包含的是JMS提供者接收消息的时间,而不是该消息实际传送的时间。这条消息头用于确定发送消息和它被消费者实际接收的时间间隔。时间戳是一个以毫秒来计算的long类型时间值(自1970年1月1日算起)。 -
JMSRedelivered
JMSRedelivered消息头表示该消息将被重新传送给消费者。如果该消息被重新传送,JMSRedelivered消息头就为true,否则为false。如果一个消费者未能确认先前传送的消息,或者JMS提供者并不确定消费者是否已经接收到该消息时,就可以将这条消息标记为重新传送
消息体
-
TextMessage
普通的字符串消息,包含一个StringTextMessage textMessage = session.createTextMessage(); textMessage.setText("字符串的消息内容");
-
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的消息体
-
ByteMessage
二进制的数组消息,包含一个byte[] -
StreamMessage
java数据流消息,用标准流操作来顺序的填充和读取 -
ObjectMessage
对象消息,包含一个可序列化的java对象
消息属性
-
如果要使用除消息头以外的值,还可以使用消息属性,
-
消息属性,对 识别,去重,重点标注的操作非要有用的方法
-
消息属性时什么: