参考视频:https://www.bilibili.com/video/BV1vJ41177j1(Java基础从入门到精通ActiveMQ+企业面试题讲解)
消息持久
ActiveMQ提供了以下三种的消息存储方式:
(1) Memory 消息存储-基于内存的消息存储。 (非持久化方案,activeMq重新启动,消息会被清空)
(2) 基于日志消息存储方式,KahaDB是ActiveMQ的默认日志存储方式,它提供了容量的提升和恢复能力。
(3) 基于JDBC的消息存储方式-数据存储于数据库(例如:MySQL)中。
查看下面的application.yml文件,delivery-mode节点可以配置持久策略,如果是jdbc数据库的持久化方式,还需要在activeMq的配置文件去配置数据库连接池等。
server:
port: 9001 #端口
spring:
application:
name: activemq-producer # 服务名称# springboot与activemq整合配置
activemq:
broker-url: tcp://192.168.66.133:61616 # 连接地址
user: admin # activemq用户名
password: admin :# activemq密码
packages:
trust-all: true # 让ActiveMQ信任全部自定义对象,实现对象的序列化或反序列化# 指定发送模式 (点对点 false , 发布订阅 true)
jms:
pub-sub-domain: false
template:
# no_persistent(非持久化配置-消息存在内存里面)
delivery-mode: persistent # 持久化配置(消息存储在日志文件里面)# 自己定义目标名称(队列或主题)
activemq:
name: springboot_queue
消息事务
一般偏向于生产者的应用,一个事务发送,其中一组消息要么全部能达到服务器,要么都不能到达服务器。
当然消费方也可以开启事务,但他的事务的开启是针对一个消息而已的,commit或rollback,回滚的化会从服务器往消费方发送6次,超过流程这个消息会进入死心队列。
消息确认机制
注意:消息确认机制与事务机制是冲突的,只能选其中一种。所以演示消息确认前,先关闭事务。
可以理解为消费端的确认机制
在事务性会话中,当一个事务被提交的时候,确认自动发生。在
非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgement mode)。该参
数有以下三个可选值:Session.AUTO_ACKNOWLEDGE:自动确认
Session.CLIENT_ACKNOWLEDGE:手动确认(最多的使用)
如果开启了手动确认的配置但是没有进行acknowledge()消息没有被ack确认的话,消息会一直存在mq服务器等待着被消费,不会被消费掉,这个时候有其他消费方连接消息还是会被接收。
Session.DUPS_ACKNOWLEDGE:延迟确认,可能会造成消息的重复发送,一般不会用到
消息的投递方式
同步、异步、延迟、定
死信队列
注意:非持久化消息不会进入DLQ(死信队列),可以通过配置给每个队列配置独立的死信队列,不然的话所有发送不成功的队列都到一个死信队列中去,不好进行处理。
重发策略
即配置重发策略,比如说重发的次数以及重发的间隔时间等等。