Activemq(五)高级特性

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(死信队列)

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值