SpringBoot下RabbitMq實(shí)現(xiàn)定時(shí)任務(wù)
本文實(shí)例為大家分享了SpringBoot下RabbitMq實(shí)現(xiàn)定時(shí)任務(wù),供大家參考,具體內(nèi)容如下
定時(shí)任務(wù)場(chǎng)景:訂單下單15分鐘未付款自動(dòng)關(guān)閉
延遲任務(wù)實(shí)現(xiàn)原理圖如下:

根據(jù)上圖看出我們需要兩個(gè)隊(duì)列(一是死信隊(duì)列,消息在里面度過TLL時(shí)間,二是處理隊(duì)列,消息度過TLL時(shí)間后進(jìn)入該隊(duì)列),兩個(gè)交換機(jī)和路由(一是用來將消息送入死信隊(duì)列,二是將消息從死信隊(duì)列送到處理隊(duì)列),但是交換機(jī)其實(shí)可以用同一個(gè),也就是一個(gè)交換機(jī)搭配兩個(gè)路由的方式。
以下為代碼實(shí)現(xiàn)過程:
//首先rabbitAdmin的配置
@Bean
public RabbitAdmin rabbitAdmin(CachingConnectionFactory cachingConnectionFactory){
RabbitAdmin rabbitAdmin = new RabbitAdmin(cachingConnectionFactory);
rabbitAdmin.setIgnoreDeclarationExceptions(true);
return rabbitAdmin;
}
然后是隊(duì)列交換機(jī)以及綁定的聲明(Queue,Exchange,Binding)
@Autowired
RabbitAdmin rabbitAdmin;
/**
* 創(chuàng)建延遲隊(duì)列,該隊(duì)列內(nèi)容不會(huì)唄監(jiān)聽,TLL到期自動(dòng)轉(zhuǎn)發(fā)
* @param queueName
* @param delayExchange
*/
public void createDelayQueue(String queueName,String delayExchange,String delayRoutingKey){
Map<String, Object> map = new HashMap<>();
/**注意這兩個(gè)參數(shù)必須綁定**/
map.put("x-dead-letter-exchange", delayExchange);
map.put("x-dead-letter-routing-key", delayRoutingKey);
rabbitAdmin.declareQueue(new Queue(queueName,true,false,false,map));
}
/**
* 創(chuàng)建普通隊(duì)列
* @param queueName
*/
public void createQueue(String queueName){
rabbitAdmin.declareQueue(new Queue(queueName,true,false,false,new HashMap<>()));
}
/**
* 創(chuàng)建延遲隊(duì)列得交換機(jī),就是一個(gè)普通得交換機(jī)
* @param name
*/
public void createExchange(String name){
rabbitAdmin.declareExchange(new DirectExchange(name,true,false));
}
/**
* 綁定隊(duì)列
* @param queueName
* @param delayExchange
* @param routeKey
*/
public void bindQueue(String queueName,String delayExchange,String routeKey){
rabbitAdmin.declareBinding(new Binding(queueName,Binding.DestinationType.QUEUE,delayExchange,routeKey,new HashMap<>()));
}
/**
* 發(fā)送消息
* @param message
* @param exchange
* @param routeKey
* @param tll 時(shí)間 單位毫秒
*/
public void sendMessageWithTll(String message,String exchange,String routeKey,String tll){
rabbitAdmin.getRabbitTemplate().convertAndSend(exchange, routeKey, message, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setExpiration(tll);
return message;
}
});
}
@Override
public void sendMessage(String message, String exchange, String routeKey) {
rabbitAdmin.getRabbitTemplate().convertAndSend(exchange, routeKey, message, new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
return message;
}
});
}
進(jìn)行測(cè)試
/**
* 監(jiān)聽消息
* @param message
* @return
*/
@RabbitListener(queues = "consumerQueue")
public void getMessage(String message){
System.out.println("收到消息getMessage:"+message +",time="+MyUtil.FormatDate(new Date()));
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot動(dòng)態(tài)Feign服務(wù)調(diào)用詳解
Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似2022-12-12
Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法
這篇文章主要介紹了Springboot 使用內(nèi)置tomcat禁止不安全HTTP的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問題及解決方法
這篇文章主要介紹了SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問題的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
話說Spring Security權(quán)限管理(源碼詳解)
本篇文章主要介紹了話說Spring Security權(quán)限管理(源碼詳解) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02
Java深入講解AWT實(shí)現(xiàn)事件處理流程
AWT的事件處理是一種委派式事件處理方式:普通組件(事件源)將整個(gè)事件處理委托給特定的對(duì)象(事件監(jiān)聽器);當(dāng)該事件源發(fā)生指定的事件時(shí),就通知所委托的事件監(jiān)聽器,由事件監(jiān)聽器來處理這個(gè)事件2022-04-04
maven install報(bào)錯(cuò)中程序包xxx不存在的問題解決
本文主要介紹了maven install報(bào)錯(cuò)中程序包xxx不存在的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

