记一次生产环境MQ阻塞问题

JSONObject o = (JSONObject) JSON.parseObject(result).get("returnStateInfo");
            String  resultCode = o.get("returnCode").toString();
            log.info("返回码: {}" , resultCode);
            try {
                if ("0000".equals(resultCode)) {
                    log.info("消息消费成功,消息内容{}",new String(body, ConfigurerInfo.CHARSET_UTF8));
                 channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);//确认消息消费成功
                } else {
                    log.info("可重试的失败处理");
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
                }

项目发短信的逻辑放在了RabbitMQ里面,为了解耦。之前出现过队列阻塞的问题,百思不得其解,之前的解决办法很粗暴,我直接删除了队列,然后重启项目,这样队列就空了不存在阻塞。偶然间终于知道了为啥会出现队列阻塞了!

原本mq是单线程处理的,发短信的逻辑是发送成功确认消费成功,短信发送失败,一直重试,上面的代码有点问题,我把业务上的失败和消费者消费失败混为一团了,解决方案如下,就算短信发送失败了(业务上的失败),也要确实消费者消费成功了,只不过把这条记录重新插入队列就Ok了!

 if ("0000".equals(resultCode)) {
                    log.info("消息消费成功,短信发送成功消息内容{}",new String(body, ConfigurerInfo.CHARSET_UTF8));
                    channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);//确认消息消费成功
                } else {
                    log.info("可重试的失败处理");
                    log.info("消息消费成功,短信发送失败,消息内容{}",new String(body, ConfigurerInfo.CHARSET_UTF8));
                    channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
                    rabbitMqService.pushMsg(queueYsxySms,smsSend); // 重新插入队列
                }

附上MQ在springboot上的配置

Last modification:October 18th, 2019 at 11:23 am