JMS(Java Message service)的消息组成详解
JMS消息组成格式
我们之前也了解到ActiveMQ是基于JMS标准的一个产品
JMS的消息到底是怎么组成的,他的格式是什么,我们很必要去指定
整个JMS协议组成结构如下:
JMS Message(消息)由三部分组成:
- 消息头 (Message Header)
- 消息体(Message Body)
- 消息属性(Message Properties)
JMS消息头
测试环境,目前用的是点对点模式
启动生产者模块
进入到activemq后台
讲解一下红色的
- JMS目的地:是讲发送的是队列(queue)还是主题(topic),由生产者设置
- JMS消息id:每条消息的唯一标记,不能被我们开发篡改的,生产方每次发的时候去生成的唯一id,消费方只有在接受到消息id才指定id是什么
- JMSDeliveryMode(敌了喂润):消息持久化,设置是否持久化
- JMSExpiration(艾克斯布瑞瞬):失效时间,单位是毫秒,值0表示不会过期默认为0
- JMSPriority(派欧ruai踢)
- JMSCorrelationID(关联消息id)(可likeA瞬):可以由我们程序篡改,通过这个id可以让生产者和消费者进行一些消息的联系,比如生产方发了个id存了个标记,然后消费者就可以拿出这个标记来判断是不是我生产方传的消息
JMSReplyTo消息回复的地址
那么接下来去程序里面更改一下这三个消息头
这个时候我们来到消息的生产方
如果要对JMS消息的消息头的更改,我们就不能用JmsMessagingTemplate,我们需要换一个API——>JmsTemplate
然后我们用JmsTemplate去发送消息
然后我们到这个消息里面看一下
只有这个给CorrelationID 关联id被修改成功。
然后这个时候我们去消费方,拿出这个关联id
这个id就可以做到消息的唯一标记,然后我们在项目中呢有很多需求,需要用到这个唯一标记,我们期望在消费方这边能够锁定住生产方的某一条消息,这个id就可以作位一个锁定的标记
JMS消息体
五种:
TextMessage:
生产方方法:
消费方方法:
MapMessage:
生产方:
消费方
输出:
ObjectMessage:
生产者:
实体类必须去序列化,否则无法发送
消费方:
1、创建实体类
生产方消费方的目录结构必须一致,然后把user拷贝过去
2、编写接受方法
这个是什么原因呢?
注意: activemq5.12后为了安全考虑,activemq默认不接受自定义对的序列化对象,需要自定义加到受信任的列表里
我们的版本是5.15.9
接下来我们要把这个对象加到我们信任列表,就是让activemq来接受自定义的对象进行序列化和反序列化
我们需要在生产方和消费方都做更改
那么就可以实现一个对象在生产方和消费方的传输
然后重启
这个时候我们就可以看到了
BytesMessage:
生产方:
- 读取文件
- 构建文件输入流
- 把文件写入到缓存数组
- 把缓存数组写入到bytesMessage中
消费方:
反过来
- 设置缓存数组
- 把字节消息的内容写入到缓存数组
- 构建文件输出流
- 把数据写处到本地硬盘
输出:
StreamMessage
是一种很基本的消息类型,主要在一个消息里面传输不同的消息类型,可以同时传递一些整数、字符串等
他跟mapMessage的区别是mapMessage是有键和值的
StreamMessage是只有值没有设置键的能力
生产方:
消费方:
五种消息类型主要是需要传递不同格式的应用场景
JMS消息属性
消息属性是随着消息随带过去的属性值
作用给消息做一下标记、过滤等功能
拿上面讲到streamMessage来讲一下属性
生产方:
消费方:
接受消息属性
输出: