ActiveMQ提高:producer产出率: 产出率=发送数据总量/时间
ActiveMQ默认使用异步发送模式(有同步,异步两种消息发送模式)

保证消息队列高可用性:
1 事务
2 持久化
3 ack确认机制
4 集群

设置useAsyncSend=true,情况下可以最大化提高produer端的发送效率,但是需要容忍小部分消息丢失的可能。

同步发送等send不阻塞了就表示一定发送成功了

异步投递:
异步发送需要接受回执并由客户端再判断一次是否发送成功。

message = session.createTextMessage(“message–”+i);
 message.setJMSMessageID(UUID.randomUUID().toString()+"—orderAtguigu");
 String msgID=message.getJMSMessageID();
 activeMQMessageProducer.send(message,new AsyncCallback(){
 @Override
 public void onSuccess(){
 System.out.println(msgID+“has been ok send”); //消息发送成功回调此方法,每一条消息由唯一msgID标识。记录发送成功的消息
 }
 @Override
 public void onException(JMSException exception)
 {
 System.out.println(msgID+“fail to send to mq”); //消息发送失败回调此方法,每一条消息由唯一msgID标识。记录发送失败的消息
 }
 });

延迟投递和定时投递
1 activemq.xml中配置schedulerSupport属性为true , 开启延时或定时投递
2 代码实现
TextMessage message=session.createTextMessage(“delay message–”+i);
message.setLongProperty(ScheduleMessage.AMQ_SCHEDULED_DELAY,delay); #延时delay秒投递消息
message.setLongProperty(ScheduleMessage.AMQ_SCHEDULED_PERIOD,period); #每隔period秒,重复投递消息
message.setLongProperty(ScheduleMessage.AMQ_SCHEDULED_REPEAT,repeat); #重复投递消息的次数 repeat 次

分发策略

ActiveMQ消费重试机制
具体哪些情况会引起消息重发?
1 Client用了transactions且在session中调用了rollback();
2 Client 用了transactions且在调用commit()之前关闭或者没有commit()
3 Client在CLIENT_ACKNOWLEDGE的传递模式下,在session中调用了recover()。#recover()消息重发命令

消息重发时间间隔和重发次数
间隔 1
次数 6

有毒消息Poison ACK的理解:
一个消息被redelivedred(重发)超过默认的最大重发次数(6)时,消费端会给MQ发送一个"poison ack"表示这个消息有毒,告诉broker不要再发了。这个
时候broker会把这个消息放到DLQ(死信队列)

死信队列:开发人员可以通过死信队列,人工处理异常消息。(默认:所有异常消息都存放到死信队列中,且非持久,过期时间的异常消息不会放入死信队列中)

如何保证消息不被重复消费?和幂等性问题?(幂等性问题,即解决重复问题)
给消息做一个唯一主键,如果出现主键重复情况,则不执行消费操作。