[关闭]
@boothsun 2017-09-06T07:42:47.000000Z 字数 1308 阅读 1120

JMS消息体分析

消息队列


  1. 转载原文地址:JMS学习(二)- JMS Message Model 组成介绍及消息头详解

消息体组成部分

JMS的message主要由三部分组成,分别是Header、Properties和Body组成。具体解释如下:

  1. Header:消息头,所有类型的这部分格式都是一样的。
  2. Properties:属性,按类型可以分成应用设置的属性,标准属性和消息中间件定义的属性。
  3. Body:消息正文,指我们具体需要消息传输的内容。

为了便于说明,下面用一个表格来描述Header中的各个属性

序号 属性名称 说明 设置者
1 JMSDestination 消息发送的目的地,是一个Topic或Queue 发送者
2 JMSDeliveryMode 消息的发送模式,分为NON_PERSISTENT和PERSISTENT,即持久化的和非持久化的 发送者
3 JMSMessageID 消息ID,需要以ID:开头 发送者
4 MSTimestamp 消息发送时的时间,也可以理解为调用send()方法时的时间,而不是该消息发送完成的时间 send
5 JMSCorrelationID 关联的消息ID,这个通常用在需要回传消息的时候 client
6 JMSReplyTo 消息回复的目的地,其值为一个Topic或Queue, 这个由发送者设置,但是接收者可以决定是否响应 client
7 JMSRedelivered 消息是否重复发送过,如果该消息之前发送过,那么这个属性的值需要被设置为true, 客户端可以根据这个属性的值来确认这个消息是否重复发送过,以避免重复处理。 Provider
8 JMSType 由消息发送者设置的个消息类型,代表消息的结构,有的消息中间件可能会用到这个,但这个并不是是批消息的种类,比如TextMessage之类的 client
9 JMSExpiration 消息的过期时间,以毫秒为单位,根据定义,它应该是timeToLive的值再加上发送时的GMT时间,也就是说这个指的是过期时间,而不是有效期 send
10 JMSPriority 消息的优先级,0-4为普通的优化级,而5-9为高优先级,通常情况下,高优化级的消息需要优先发送 send

从上表中我们可以看到,系统提供的标准头信息一共有10个属性,其中有6个是由send方法在调用时设置的,有三个是由客户端设置的,还有一个是由消息中间件设置的。

需要注意的是,这里的client不是指定消费者,而是指使用JMS的客户端,即开发者所写的应用程序,即在生产消息时,这三个属性是可以由应用程序来设定的,而其它的header要么由消息中间件设置,要么由发送方来决定,开发者即使设置了,也是无效的。

为了验证我们的猜测,个人做了个测试,结果如下:

以上截图只显示了关键的设置代码和消费者获取到消息之后的打印结果,从中可以得到以下结论:

  1. 只有JmsType, ReplyTo和CorrelationId可以显示设置,其它都无效
  2. 优先级和有效期可以由生产者来设置
  3. Expiration的值等于Timestemp的时间加上timeToLive的值,是一个绝对时间。

基于以上结论,对于大多数属性来说,我们知道其表示的意义即可,因为我们无法改变这些值的设置。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注