挖坑记录~activeMQ进阶

传输协议

conf中的配置文件中看到这段配置
在这里插入图片描述
http://activemq.apache.org/configuring-transports.html

支持的协议有AMQP/MQTT/TCP/NIO/AUTO 等等
每种协议都有自己不同的特点

控制台显示了目前支持的客户端连接方式
默认使用的就是tcp, 就是openwire ,两者的端口一样
在这里插入图片描述
tcp
http://activemq.apache.org/tcp-transport-reference

nio
nio是一种异步io模型, 可以搭配其他传输协议, 仅作用于服务端 ,如果不指明, 默认是使用tcp
在这里插入图片描述
auto
可以自动检测OpenWire, STOMP, AMQP, and MQTT
http://activemq.apache.org/auto

持久化

为了服务挂了后不丢失数据, mq将自己的数据同步到其他存储点
同步数据为数据, 生产者, 索引, 集群broker锁, 恢复回滚等信息

http://activemq.apache.org/persistence
在这里插入图片描述
mysql
4版本使用, 远程存储, 因为要连接数据库, 速度慢
每条消息对应一条数据, 对于queue消费完删除
在这里插入图片描述
可配合一个高速缓存journal, 开启后消息优先写入缓存, 长时间未消费或未消费完时才将剩余的消息存入数据库

AMQ Message Store
kahadb之前使用, 本地存储, 速度快

kahadb
5以上版本使用
本地服务存储, 速度不如AMQ Message Store, 但体积小,扩展好

leveldb
本地存储, 速度快

Replicated LevelDB
通过zookeeper, 可以搭建activeMQ的高可用集群, 集群中只有主节点提供服务, 主节点将数据同步给slaves

ActiveMQ特性

异步投递

默认使用异步投递, 生产者异步发送消息, 默认消息发送成功.
生产者在非事务且消息持久化的情况下, 无法确认消息发送情况, 采用同步阻塞, 等待broker服务端回执, 这种方式安全但效率低.

开始异步的代码

  ((ActiveMQConnection)connection).setUseAsyncSend(true);

异步投递时可以使用消息回执, 在生产者发送完消息时, 通过回调函数处理消息发送成功和失败的情况

ActiveMQMessageProducer activeMQMessageProducer = (ActiveMQMessageProducer)session.createProducer(queue);
....
 final String  msgId = textMessage.getJMSMessageID();
                activeMQMessageProducer.send(textMessage, new AsyncCallback() {
                    public void onSuccess() {
                        System.out.println("成功发送消息Id:"+msgId);
                    }

                    public void onException(JMSException e) {
                        System.out.println("失败发送消息Id:"+msgId);
                    }
                });

延时/定时投递

http://activemq.apache.org/delay-and-schedule-message-delivery.html

配置文件开启延时投递
 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}"  schedulerSupport="true" >

使用消息属性设置延时参数
效果为, 初次延迟3秒投递, 之后每4秒投递一次, 总共投递5次

 // 延迟的时间3
                textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
                // 重复投递的时间间隔 4
                textMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
                // 重复投递的次数 5
                textMessage.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat); 

重新投递

如果消费者在手动确认的情况下收到消息但没有确认或者没有提交, 导致消息重复消费, 直到消息达到重投限制, 消费者会主动向broker发送poison_ack(有毒确认), 该条消息将被移除队列放入死信队列
http://activemq.apache.org/redelivery-policy
配置项
在这里插入图片描述
maximumRedeliveries 最大重投次数
redeliveryDelay 重投间隔
backOffMultiplier 重投间隔是否膨胀

通过消费方代码更改默认配置

// 修改默认参数,设置消息消费重试3次
        RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
        redeliveryPolicy.setMaximumRedeliveries(3);
        activeMQConnectionFactory.setRedeliveryPolicy(redeliveryPolicy);

死信队列

当消费方的业务系统中出现异常, 无法继续执行, 可以不提交此条消息, 继续重复消费到达限制时, 消息进入死信队列, 可以启动一个消费者一直消费死信队列中的信息
非持久的化的消息默认不进入死信队列, 直接丢弃

在这里插入图片描述
指定消费死信队列中的消息
在这里插入图片描述
消费后
在这里插入图片描述
也可以手动从控制台中将消息放回队列, 默认放回所属队列
在这里插入图片描述
放回所属队列后, 会作为一条新的消息重新计算消费次数, 直到再次放入死信队列
在这里插入图片描述

防止消息重复消费

给消息属性设置个性标识, 将已消费的消息标识存放在系统中, 每次消费前进行对比

注意

临时文件空间

持久化会将临时文件放到服务器上, 如果服务器空间已满, 旧的消息也没有及时消费的话, 会丢失消息, 包括但不限于kahadb等持久化服务, 死信队列等

主机名称

messageID生成会使用主机名, 当主机中出现非法字符时, 可能会报错
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200803174741537.png

猜你喜欢

转载自blog.csdn.net/weixin_43453109/article/details/107758241