使用場景
- 訂單下單30分鐘後,如果用戶沒有付款,則系統自動取消訂單。
- 會議開始前10分鐘,推送消息提醒用戶。
- 自定義某個操作的執行時間,如果設置文章在明早9點發布。
概要
- 新增type爲x-delayed-message的exchange,必須配置x-delayed-type: topic/direct/fanout。
- 新增隊列queue1, 綁定exchange和routingkey(rountingkey根據自己的需求來,可配可不配)。
- 生產者設置消息的delay時長併發送消息至queue1。
- 消費者消費queue1。
該插件的影響和限制
- 會降低性能,所以如果沒有該需求,則不要使用。
- 該插件不適合大數據量的延時消息,比如百萬或一億。
- 延時時長:0<=n<=(2^32)-1 ,單位毫秒。
步驟
1.下載並安裝插件
rabbitmq_delayed_message_exchange 插件,這是一個 GitHub 上的開源項目,我們直接下載即可:
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
選擇適合自己的版本,放到插件目錄,執行如下命令
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
2.在Springboot項目裏面配置自定義交換機
@Bean
CustomExchange customExchange() {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
return new CustomExchange(EXCHANGE_NAME, EXCHANGE_TYPE, true, false,args);
}
這裏主要是交換機的定義有所不同,小夥伴們需要注意。
這裏我們使用的交換機是 CustomExchange,這是一個 Spring 中提供的交換機,創建 CustomExchange 時有五個參數,含義分別如下:
- 交換機名稱。
- 交換機類型,這個地方是固定的。
- 交換機是否持久化。
- 如果沒有隊列綁定到交換機,交換機是否刪除。
- 其他參數。
最後一個 args 參數中,指定了交換機消息分發的類型,這個類型就是大家熟知的 direct、fanout、topic 以及 header 幾種,用了哪種類型,將來交換機分發消息就按哪種方式來。
3.創建生產者和消費者
創建一個消費者:
@Component
public class MsgReceiver {
private static final Logger logger = LoggerFactory.getLogger(MsgReceiver.class);
@RabbitListener(queues = RabbitConfig.QUEUE_NAME)
public void handleMsg(String msg) {
logger.info("handleMsg,{}",msg);
}
}
使用單元測試創建一個生產者:
@SpringBootTest
class MqDelayedMsgDemoApplicationTests {
@Autowired
RabbitTemplate rabbitTemplate;
@Test
void contextLoads() throws UnsupportedEncodingException {
Message msg = MessageBuilder.withBody(("hello 江南一點雨"+new Date()).getBytes("UTF-8")).setHeader("x-delay", 3000).build();
rabbitTemplate.convertAndSend(RabbitConfig.EXCHANGE_NAME, RabbitConfig.QUEUE_NAME, msg);
}
}
在消息頭中設置消息的延遲時間。