Springboot使用RabbitMQ實(shí)現(xiàn)關(guān)閉超時(shí)訂單(示例詳解)
1.maven中引入rabbitmq的依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>2.application.yml中進(jìn)行rabbitmq相關(guān)配置:
# rabbitmq空一格寫,內(nèi)嵌在spring里邊
rabbitmq:
host: 192.168.56.10
port: 5672
virtual-host: /
#發(fā)送端確認(rèn)機(jī)制 correlated:發(fā)布消息成功到交換器后會觸發(fā)回調(diào)方法
publisher-confirm-type: correlated
template:
# 只要抵達(dá)隊(duì)列,以異步發(fā)送優(yōu)先回調(diào)以異步發(fā)送優(yōu)先回調(diào)我們這個returnconfirm
mandatory: true
# 開啟發(fā)送消息抵達(dá)隊(duì)列的確認(rèn)
publisher-returns: true在項(xiàng)目啟動類中添加開啟rabbitmq的注解@EnableRabbit
3.創(chuàng)建交換機(jī),隊(duì)列,并將隊(duì)列綁定到指定交換機(jī):
import com.atguigu.gulimall.order.entity.OrderEntity;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class MyMQConfig {
@Bean
public Queue orderDelayQueue(){
/* * 構(gòu)造一個死信隊(duì)列
* x-dead-letter-exchange: order-event-exchange
* x-dead-letter-routing-key: order.release.order
* x-message-ttl: 60000
* @create 2025/1/1
**/
Map<String,Object>arguments=new HashMap<>();
arguments.put("x-dead-letter-exchange","order-event-exchange");
arguments.put("x-dead-letter-routing-key","order.release.order");
arguments.put("x-message-ttl",60000);
Queue queue = new Queue("order.delay.queue", true, false, false,arguments);
return queue;
}
@Bean
public Queue orderReleaseOrderQueue(){
Queue queue = new Queue("order.release.order.queue", true, false, false);
return queue;
}
@Bean
public Exchange orderEventExchange(){
return new TopicExchange("order-event-exchange",true,false);
}
@Bean
public Binding orderCreateOrderBinding(){
return new Binding("order.delay.queue", Binding.DestinationType.QUEUE,"order-event-exchange","order.create.order",null);
}
@Bean
public Binding orderReleaseOrderBinding(){
return new Binding("order.release.order.queue", Binding.DestinationType.QUEUE,"order-event-exchange","order.release.order",null);
}
}
在上面的代碼中,創(chuàng)建了2個隊(duì)列:order.delay.queue和order.release.order.queue,其中order.delay.queue是延時(shí)隊(duì)列,為了方便演示,將延時(shí)時(shí)間設(shè)置為1分鐘(60000ms)。order.release.order.queue是普通隊(duì)列。創(chuàng)建了1個交換機(jī):order-event-exchange。order.delay.queue隊(duì)列通過路由鍵order.create.order綁定到order-event-exchange交換機(jī),order.release.order.queue隊(duì)列通過路由鍵order.release.order也綁定到order-event-exchange交換機(jī)。在交換機(jī)的選擇上,考慮到要綁定到不同的隊(duì)列和路由鍵,支持模糊匹配,這里使用Topic交換機(jī)。
4.在MyMQConfig 創(chuàng)建一個方法監(jiān)聽隊(duì)列:
@RabbitListener(queues = "order.release.order.queue")
public void listener(OrderEntity order, Channel channel, Message message) throws IOException {
System.out.println("收到過期的訂單信息,準(zhǔn)備關(guān)閉訂單"+order.getOrderSn());
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
}添加上面的方法后,當(dāng)我們的服務(wù)連上rabbitmq,rabbitmq就會創(chuàng)建上面@Bean標(biāo)注的交換機(jī)和隊(duì)列了。
5.寫一個創(chuàng)建訂單的接口,簡單模擬下這個過程:
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/test/createOrder")
@ResponseBody
public String creatOrder(){
OrderEntity order=new OrderEntity();
order.setOrderSn(UUID.randomUUID().toString());
order.setCreateTime(new Date());
rabbitTemplate.convertAndSend("order-event-exchange","order.create.order",order);
return "ok";
}使用rabbitTemplate將訂單數(shù)據(jù)通過交換機(jī)order-event-exchange和路由鍵order.create.order將訂單數(shù)據(jù)order發(fā)送給隊(duì)列order.delay.queue。啟動服務(wù)調(diào)用接口,來觀察rabbitmq后臺隊(duì)列的變化:

可以看到 order.delay.queue隊(duì)列中有1條消息等待消費(fèi),由于rabbitmq后臺每隔5秒刷新一次,過1分鐘再去看,隊(duì)列中已有消息了。

到此這篇關(guān)于Springboot使用RabbitMQ實(shí)現(xiàn)關(guān)閉超時(shí)訂單的一個簡單示例的文章就介紹到這了,更多相關(guān)Springboot RabbitMQ關(guān)閉超時(shí)訂單內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot使用Rabbitmq的延時(shí)隊(duì)列+死信隊(duì)列實(shí)現(xiàn)消息延期消費(fèi)
- SpringBoot整合Canal+RabbitMQ監(jiān)聽數(shù)據(jù)變更詳解
- SpringBoot整合RabbitMQ實(shí)現(xiàn)流量消峰
- SpringBoot集成和使用RabbitMQ方式
- springboot整合RabbitMQ中死信隊(duì)列的實(shí)現(xiàn)
- SpringBoot 整合 RabbitMQ 的使用方式(代碼示例)
- springboot整合rabbitmq實(shí)現(xiàn)訂單超時(shí)取消案例分析
相關(guān)文章
mybatis注解之@Mapper和@MapperScan的使用
這篇文章主要介紹了mybatis注解之@Mapper和@MapperScan的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10
gRPC實(shí)踐之proto及Maven插件概念及使用詳解
這篇文章主要為大家介紹了gRPC實(shí)踐之proto及Maven插件概念及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
解決RestTemplate 的getForEntity調(diào)用接口亂碼的問題
這篇文章主要介紹了解決RestTemplate 的getForEntity調(diào)用接口亂碼的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring聲明式事務(wù)@Transactional注解實(shí)現(xiàn)元數(shù)據(jù)驅(qū)動的事務(wù)管理
這篇文章主要為大家介紹了Spring聲明式事務(wù)@Transactional注解實(shí)現(xiàn)元數(shù)據(jù)驅(qū)動的事務(wù)管理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
SpringBoot同一個方法操作多個數(shù)據(jù)源保證事務(wù)一致性
本文探討了在Spring Boot應(yīng)用中,如何在同一個方法中操作多個數(shù)據(jù)源并保證事務(wù)的一致性,由于聲明式事務(wù)的限制,直接使用@Transactional注解無法滿足需求,文章介紹了解決方案:編程式事務(wù),它允許在代碼級別更靈活地管理事務(wù),確保多數(shù)據(jù)源操作的事務(wù)一致性2024-11-11

