* RabbitMQメッセージキューを使用する過程で、メッセージの消費を遅らせることができないという問題が発生した場合、おおよそ次の4つの解決策があります。
1.RabbitMQ自体は遅延消費をサポートしていません
RabbitMQを使用するには、遅延プラグインまたはデッドレターを統合する必要があります。他の2つの記事を参照できます。
1.死信方式:https://blog.csdn.net/weixin_43945983/article/details/109293486
2.插件方式:https://blog.csdn.net/weixin_43945983/article/details/109316430
注:最も基本的な先入れ先出しを実現できるため、プラグイン方式を好みます。
2.プラグインのバージョンに一貫性がありません
遅延プラグインがインストールされている場合は、RabbitMQのバージョンがプラグインのバージョンと一致しているかどうかを確認する必要があります。一致していない場合、遅延は有効になりません。
3.メッセージを送信するためのインターフェースが正しくありません
上記の2つの手順で問題がない場合は、メッセージの送信に使用されているテンプレートAPIを確認する必要があります
1.AmqpTemplate:AmqpTemplate接口定义了发送和接收消息的所有基本操作
2.RabbitTemplate:实现自AmqpTemplate
注:ソースコードを見ると、rabbitTemplateは実際にはamqpTemplateインターフェースから実装されているため、使用法に違いはないようですが、実際のプロジェクトでは、RabbitTemplateを使用してメッセージを送信すると遅延が発生することがわかりました無効になります;そして遅延消費のためにAmqpTemplateに切り替えますそれは有効になりました。
コード例:
package com.jeesite.modules.sp.api.rabbitmq;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
/**
* 延迟短信 MQ 发送者
*/
@Service
@Component
public class MQSmsDelaySender {
private static Logger log = LoggerFactory.getLogger(MQSmsDelaySender.class);
@Autowired
AmqpTemplate rabbitTemplate;
//发送延时消息
public void sendDelayedMessage(JSONObject jsonObject,String delayTime){
log.info("-------------------发送延时短信 = " + jsonObject.toJSONString()+",延迟时间:"+delayTime);
rabbitTemplate.convertAndSend(MQConfig.SMS_DELAY_EXCHANGE, MQConfig.SMS_DELAY_QUEUE, jsonObject,
new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
//设置消息持久化
message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
message.getMessageProperties().setHeader("x-delay",delayTime);//设置延时时间
return message;
}
});
}
}
4.生成されたQUEUE(メッセージキュー)とEXCHANGE(交換)を削除します
上記の3つの手順を実行しても遅延が有効にならない場合は、RabbitMQ管理プラットフォームにログインし、対応するQUEUE(メッセージキュー)とEXCHANGE(交換)を見つけて削除すると、遅延送信がすぐに有効になります。