SpringBoot下RabbitMq實現(xiàn)定時任務(wù)
本文實例為大家分享了SpringBoot下RabbitMq實現(xiàn)定時任務(wù),供大家參考,具體內(nèi)容如下
定時任務(wù)場景:訂單下單15分鐘未付款自動關(guān)閉
延遲任務(wù)實現(xiàn)原理圖如下:
根據(jù)上圖看出我們需要兩個隊列(一是死信隊列,消息在里面度過TLL時間,二是處理隊列,消息度過TLL時間后進入該隊列),兩個交換機和路由(一是用來將消息送入死信隊列,二是將消息從死信隊列送到處理隊列),但是交換機其實可以用同一個,也就是一個交換機搭配兩個路由的方式。
以下為代碼實現(xiàn)過程:
//首先rabbitAdmin的配置 @Bean public RabbitAdmin rabbitAdmin(CachingConnectionFactory cachingConnectionFactory){ RabbitAdmin rabbitAdmin = new RabbitAdmin(cachingConnectionFactory); rabbitAdmin.setIgnoreDeclarationExceptions(true); return rabbitAdmin; }
然后是隊列交換機以及綁定的聲明(Queue,Exchange,Binding)
@Autowired RabbitAdmin rabbitAdmin; /** * 創(chuàng)建延遲隊列,該隊列內(nèi)容不會唄監(jiān)聽,TLL到期自動轉(zhuǎn)發(fā) * @param queueName * @param delayExchange */ public void createDelayQueue(String queueName,String delayExchange,String delayRoutingKey){ Map<String, Object> map = new HashMap<>(); /**注意這兩個參數(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)建普通隊列 * @param queueName */ public void createQueue(String queueName){ rabbitAdmin.declareQueue(new Queue(queueName,true,false,false,new HashMap<>())); } /** * 創(chuàng)建延遲隊列得交換機,就是一個普通得交換機 * @param name */ public void createExchange(String name){ rabbitAdmin.declareExchange(new DirectExchange(name,true,false)); } /** * 綁定隊列 * @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 時間 單位毫秒 */ 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; } }); }
進行測試
/** * 監(jiān)聽消息 * @param message * @return */ @RabbitListener(queues = "consumerQueue") public void getMessage(String message){ System.out.println("收到消息getMessage:"+message +",time="+MyUtil.FormatDate(new Date())); }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java實現(xiàn)md5和base64加密解密的示例代碼
這篇文章主要介紹了Java實現(xiàn)md5和base64加密解密的示例代碼,幫助大家更好的利用Java加密解密文件,感興趣的朋友可以了解下2020-09-09IDEA mybatis-generator逆向工程生成代碼
這篇文章主要介紹了IDEA mybatis-generator逆向工程生成代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06Spring Boot 中的任務(wù)執(zhí)行器基本概念及使用方法
務(wù)執(zhí)行器是 Spring Boot 中的一個非常實用的模塊,它可以簡化異步任務(wù)的開發(fā)和管理,在本文中,我們介紹了任務(wù)執(zhí)行器的基本概念和使用方法,以及一個完整的示例代碼,需要的朋友可以參考下2023-07-07IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼
這篇文章主要介紹了IDEA 開發(fā)配置SparkSQL及簡單使用案例代碼,本文通過代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08SpringBoot?整合RabbitMq?自定義消息監(jiān)聽容器來實現(xiàn)消息批量處理
Spring Boot中提供了默認的監(jiān)聽器容器,但是有時候我們需要自定義監(jiān)聽器容器,來滿足一些特殊的需求,比如批量獲取數(shù)據(jù),這篇文章主要介紹了SpringBoot?整合RabbitMq?自定義消息監(jiān)聽容器來實現(xiàn)消息批量處理,需要的朋友可以參考下2023-04-04springBoot下實現(xiàn)java自動創(chuàng)建數(shù)據(jù)庫表
這篇文章主要介紹了springBoot下實現(xiàn)java自動創(chuàng)建數(shù)據(jù)庫表的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07