ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

JMS(Java Message service)的消息组成详解

JMS消息组成格式

我们之前也了解到ActiveMQ是基于JMS标准的一个产品
JMS的消息到底是怎么组成的,他的格式是什么,我们很必要去指定

整个JMS协议组成结构如下:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
JMS Message(消息)由三部分组成:

  1. 消息头 (Message Header)
  2. 消息体(Message Body)
  3. 消息属性(Message Properties)

JMS消息头

ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
测试环境,目前用的是点对点模式

启动生产者模块
进入到activemq后台
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
讲解一下红色的

  1. JMS目的地:是讲发送的是队列(queue)还是主题(topic),由生产者设置
    ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
  2. JMS消息id:每条消息的唯一标记,不能被我们开发篡改的,生产方每次发的时候去生成的唯一id,消费方只有在接受到消息id才指定id是什么
  3. JMSDeliveryMode(敌了喂润):消息持久化,设置是否持久化
  4. JMSExpiration(艾克斯布瑞瞬):失效时间,单位是毫秒,值0表示不会过期默认为0
  5. JMSPriority(派欧ruai踢)ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
  6. JMSCorrelationID(关联消息id)(可likeA瞬):可以由我们程序篡改,通过这个id可以让生产者和消费者进行一些消息的联系,比如生产方发了个id存了个标记,然后消费者就可以拿出这个标记来判断是不是我生产方传的消息
    JMSReplyTo消息回复的地址
    ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

那么接下来去程序里面更改一下这三个消息头

这个时候我们来到消息的生产方
如果要对JMS消息的消息头的更改,我们就不能用JmsMessagingTemplate,我们需要换一个API——>JmsTemplate

然后我们用JmsTemplate去发送消息
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
然后我们到这个消息里面看一下
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
只有这个给CorrelationID 关联id被修改成功。

然后这个时候我们去消费方,拿出这个关联id

这个id就可以做到消息的唯一标记,然后我们在项目中呢有很多需求,需要用到这个唯一标记,我们期望在消费方这边能够锁定住生产方的某一条消息,这个id就可以作位一个锁定的标记
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

JMS消息体

五种:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

TextMessage:

生产方方法:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
消费方方法:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

MapMessage:

生产方:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
消费方
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
输出:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

ObjectMessage:

生产者:
实体类必须去序列化,否则无法发送
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

消费方:
1、创建实体类
生产方消费方的目录结构必须一致,然后把user拷贝过去
2、编写接受方法
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
这个是什么原因呢?

注意: activemq5.12后为了安全考虑,activemq默认不接受自定义对的序列化对象,需要自定义加到受信任的列表里

我们的版本是5.15.9
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
接下来我们要把这个对象加到我们信任列表,就是让activemq来接受自定义的对象进行序列化和反序列化

我们需要在生产方和消费方都做更改
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
那么就可以实现一个对象在生产方和消费方的传输
然后重启
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
这个时候我们就可以看到了

BytesMessage:

生产方:

  1. 读取文件
  2. 构建文件输入流
  3. 把文件写入到缓存数组
  4. 把缓存数组写入到bytesMessage中
    ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

消费方:
反过来

  1. 设置缓存数组
  2. 把字节消息的内容写入到缓存数组
  3. 构建文件输出流
  4. 把数据写处到本地硬盘

ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
输出:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

StreamMessage

是一种很基本的消息类型,主要在一个消息里面传输不同的消息类型,可以同时传递一些整数、字符串等
他跟mapMessage的区别是mapMessage是有键和值的
StreamMessage是只有值没有设置键的能力

生产方:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
消费方:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
五种消息类型主要是需要传递不同格式的应用场景

JMS消息属性

消息属性是随着消息随带过去的属性值
作用给消息做一下标记、过滤等功能
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

拿上面讲到streamMessage来讲一下属性
生产方:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

消费方:
接受消息属性
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])
输出:
ActiveMQ学习三(高级特性1:消息组成[消息头、消息体、消息属性])

相关文章:

  • 2021-05-03
  • 2021-06-20
  • 2022-12-23
  • 2022-12-23
  • 2022-01-18
  • 2022-12-23
  • 2021-05-26
  • 2022-01-12
猜你喜欢
  • 2021-10-02
  • 2022-12-23
  • 2021-12-27
  • 2022-01-07
  • 2021-11-03
  • 2021-10-05
  • 2021-05-19
相关资源
相似解决方案