基础用法
消息确认模式( AcknowledgeMode )
- NONE:自动确认,一旦消息到达了消费者端即视为该消息无误了。该情况可能会出现若消费者端出现了异常,而此时又自动确认了,因此容易导致消息删除,容易造成消息丢失。
- AUTO:根据情况确认
- 执行无异常将自动确认
- 执行抛出 AmqpRejectAndDontRequeueException 异常将被拒绝,但不会重新进入队列
- 执行抛出 ImmediateAcknowledgeAmqpException 异常将会被确认接收
- 其他异常,且设置的requeue参数(重新进入队列)为true则会拒绝
- MANUAL:手动确认,自定义拒绝策略
使用过程出现问题
- 编写队列发送后,消费者端无法接收。
**检查 **mq-config.properties
配置文件中cmq.forbiddenCreate
参数是否为false,允许创建队列#CMQ配置 mq.type=cmq #CMQ队列URL cmq.queue.endpoint=https://cmq-queue-gz.api.qcloud.com #CMQ主题URL cmq.topic.endpoint=https://cmq-topic-gz.api.qcloud.com #是否禁止创建队列或者主题true禁止,false可以创建 cmq.forbiddenCreate=false cmq.secretId=AKIDb8VkogVrAHD3mYJaoqgLrHbzEIAqDcic cmq.secretKey=32ub8TcFj29qRr6A3lLkJl5EOQHwPglf
- 消息发送失败。
配置文件中的ID 及其 key 是否合法或者相匹配,需要着重关注是否因为是账号过期或者更换过key导致
解决幂等问题
** **使用缓存,通过拼接一段由门店ID及其订单号组成的字符串,将该段字符串作为key存储进缓存中,并设置时效为30s。以此来控制并发问题,防止由于消息重发导致重复统计问题。
** **注:设置的时效时需要考虑到,MQ的重发延迟时间及其次数,防止由于消息的重发导致重复统计
reenKey = "ACTIVITY_STATISTICS_DISCOUNT_" + msgBody.getOutMchId() + "_" + msgBody.getListid();
//添加一个用于控制并发的缓存
boolean addFlag = cacheClient.add(reenKey, "1", 30);
if (!addFlag) {
result.setRetcode(ConsumerErrorCode.ERR_CACH_ADD);
LOG.error("[{}]-有折扣活动正在处理中:msgBody={}", ThreadLocalUtils.getThreadSerial());
return result;
}