国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

超簡(jiǎn)單的RabbitMq實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消

這篇具有很好參考價(jià)值的文章主要介紹了超簡(jiǎn)單的RabbitMq實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

很簡(jiǎn)單的實(shí)現(xiàn)方法,大家?guī)兔纯茨懿荒芾^續(xù)完善。

rabbitmq死信隊(duì)列 訂單超時(shí),java-rabbitmq,rabbitmq,springboot

步驟:

  1. 添加rabbitmq配置
  2. 添加rabbitmq配置類
  3. 添加訂單生產(chǎn)者
  4. 添加訂單消費(fèi)者(修改狀態(tài))

1、添加rabbitmq配置

注意一定要開啟手動(dòng)應(yīng)答,不然可能會(huì)報(bào)錯(cuò)

spring  
  rabbitmq:
    host: 你的地址
    port: 5672
    username: admin
    password: admin
    listener:
      simple:
#        開啟手動(dòng)應(yīng)答
        acknowledge-mode: manual

2、添加rabbitmq配置類

下面這段代碼看著有點(diǎn)繁瑣,我解釋一下邏輯關(guān)系。

rabbitmq死信隊(duì)列 訂單超時(shí),java-rabbitmq,rabbitmq,springboot

1、聲明訂單交換機(jī)、聲明訂單隊(duì)列,在訂單隊(duì)列中聲明綁定的死信交換機(jī)

2、訂單交換機(jī)Binding訂單隊(duì)列

3、聲明死信交換機(jī)、隊(duì)列并且Binding

package com.lutao.config;

import com.rabbitmq.client.AMQP;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;

@Configuration
public class RabbitMqConfig {

    public static final String ORDER_QUEUE = "order_queue";
    public static final String ORDER_EXCHANGE = "order_exchange";
    public static final String ORDER_DEAD_EXCHANGE = "order_dead_exchange";
    public static final String ORDER_DEAD_QUEUE = "order_dead_queue";
    public static final String ORDER_ROUTING = "order_routing";
    public static final String ORDER_DEAD_ROUTING = "order_dead_routing";
    /**
     * 訂單交換機(jī)
     */
    @Bean("orderExchange")
    public DirectExchange getOrderExchange(){
        return new DirectExchange(ORDER_EXCHANGE);
    }
    /**
     * 訂單隊(duì)列
     */
    @Bean("orderQueue")
    public Queue getOrderQueue(){
        HashMap<String, Object> map = new HashMap<>(3);
        map.put("x-dead-letter-exchange",ORDER_DEAD_EXCHANGE);
        map.put("x-dead-letter-routing-key",ORDER_DEAD_ROUTING);
        map.put("x-message-ttl",30000);
        return QueueBuilder.durable(ORDER_QUEUE).withArguments(map).build();
    }

    /**
     * 訂單交換機(jī)與訂單隊(duì)列綁定
     */
    @Bean
    public Binding oExchangeBindingO(
            @Qualifier("orderExchange") DirectExchange exchange,
            @Qualifier("orderQueue") Queue queue
    ){
        return BindingBuilder.bind(queue).to(exchange).with(ORDER_ROUTING);
    }
    /**
     * 死信交換機(jī)
     */
    @Bean("orderDeadExchange")
    public DirectExchange getOrderDeadExchange(){
        return new DirectExchange(ORDER_DEAD_EXCHANGE);
    }
    /**
     * 死信隊(duì)列
     */
    @Bean("orderDeadQueue")
    public Queue getOrderDradQueue(){
        return new Queue(ORDER_DEAD_QUEUE,true,false,false,null);
    }

    @Bean
    public Binding deadExchangeDead(
            @Qualifier("orderDeadExchange") DirectExchange exchange,
            @Qualifier("orderDeadQueue") Queue queue
    ){
        return BindingBuilder.bind(queue).to(exchange).with(ORDER_DEAD_ROUTING);
    }
}

3、添加訂單生產(chǎn)者

在插入新訂單數(shù)據(jù)時(shí),向訂單隊(duì)列發(fā)送一條延遲時(shí)間為30秒的信息

@Override
    @Transactional
    public void insertOrder(OT ot) {
        Orders orders = new Orders();
        BeanUtils.copyProperties(ot, orders);
        List<CartVO> listCart = ot.getListCart();
        //生成訂單號(hào)
        String onumber = get16UUID();
        orders.setOnumber(onumber);
        ordersMapper.insertOrder(orders);
        //刪除購(gòu)物車
        Integer[] cids = new Integer[listCart.size()];
        for (int i = 0; i < listCart.size(); i++) {
            CartVO cartVO = listCart.get(i);
            ordersMapper.insertGoods(onumber, cartVO);
            cids[i] = listCart.get(i).getCid();
        }
        //發(fā)送到隊(duì)列中
        //將訂單編號(hào)發(fā)送到隊(duì)列中
        log.info("將訂單編號(hào)發(fā)送到訂單隊(duì)列中");
        rabbitTemplate.convertAndSend(RabbitMqConfig.ORDER_EXCHANGE,RabbitMqConfig.ORDER_ROUTING,orders.getOnumber());
        cartMapper.deleteCid(cids);
    }

4、死信隊(duì)列消費(fèi)者處理信息

30秒后訂單進(jìn)入死信隊(duì)列,由消費(fèi)者消費(fèi),根據(jù)訂單號(hào)查詢訂單的狀態(tài)如果還是0(未支付)則將狀態(tài)更新成(2)已取消。文章來源地址http://www.zghlxwxcb.cn/news/detail-679328.html

@Autowired
    private OrdersMapper ordersMapper;
    /**
     * 判斷是否在規(guī)定時(shí)間內(nèi)支付
     *
     * @param message
     * @param channel
     * @throws IOException
     */
    @RabbitListener(queues = RabbitMqConfig.ORDER_DEAD_QUEUE)
    public void receive(Message message, Channel channel) throws IOException {
        log.info("訂單進(jìn)入死信隊(duì)列");
        String msg = new String(message.getBody());
        log.info("訂單號(hào):"+msg);
        OrderPageRequest request = new OrderPageRequest();
        request.setOnumber(msg);
        Integer status = ordersMapper.getStatusByONumber(msg);
        if (status != null && status == 0){
            ordersMapper.updateStatus(msg,2);
        }
        //應(yīng)答
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }

到了這里,關(guān)于超簡(jiǎn)單的RabbitMq實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 簡(jiǎn)單的RabbitMQ集成Springboot實(shí)現(xiàn)訂單異步發(fā)送功能示例以及RabbitMQ的相關(guān)問題

    引入RabbitMQ的依賴,在pom.xml文件中添加以下代碼: 在application.properties文件中配置RabbitMQ的相關(guān)信息: 創(chuàng)建消息隊(duì)列,并定義消息接收者: 定義消息發(fā)送者: 在需要發(fā)送訂單信息的地方調(diào)用OrderSender的send方法即可: RabbitMQ是一個(gè)開源的消息中間件,主要用于實(shí)現(xiàn)應(yīng)用之間的異

    2024年02月09日
    瀏覽(25)
  • 商城系統(tǒng)中30分鐘未付款自動(dòng)取消訂單怎么實(shí)現(xiàn)(簡(jiǎn)單幾種方法)

    商城系統(tǒng)中30分鐘未付款自動(dòng)取消訂單怎么實(shí)現(xiàn)(簡(jiǎn)單幾種方法)

    實(shí)現(xiàn)以上功能 寫一個(gè)定時(shí)任務(wù),每隔 30分鐘執(zhí)行一次,列出所有超出時(shí)間范圍得訂單id的列表 批量執(zhí)行取消訂單操作 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的隊(duì)列,每隔一定時(shí)間執(zhí)行隊(duì)列。 這里使用隊(duì)列的優(yōu)勢(shì)可以跟前端時(shí)間匹配上,前端讀秒幾秒這里就什么時(shí)候取消? 使用mq隊(duì)列,消費(fèi)消息。如

    2024年01月24日
    瀏覽(21)
  • 支付超時(shí)取消訂單實(shí)現(xiàn)方案 - 定時(shí)任務(wù)、延遲隊(duì)列、消息隊(duì)列等

    支付超時(shí)取消訂單實(shí)現(xiàn)方案 - 定時(shí)任務(wù)、延遲隊(duì)列、消息隊(duì)列等

    在實(shí)際業(yè)務(wù)場(chǎng)景中,我們經(jīng)常會(huì)碰到類似一下場(chǎng)景: 淘寶等購(gòu)物平臺(tái)在訂單支付時(shí),如果30分鐘內(nèi)未支付自動(dòng)取消。 騰訊會(huì)議預(yù)約會(huì)議后,在會(huì)議開始前15分鐘提醒。 未使用的優(yōu)惠券有效期結(jié)束后,自動(dòng)將優(yōu)惠券狀態(tài)更新為已過期。 等等。。。 像這種支付超時(shí)取消的場(chǎng)景需

    2024年04月22日
    瀏覽(33)
  • 訂單自動(dòng)取消的11種實(shí)現(xiàn)方式(下)

    訂單自動(dòng)取消的11種實(shí)現(xiàn)方式(下)

    在Redis中,有個(gè)發(fā)布訂閱的機(jī)制 生產(chǎn)者在消息發(fā)送時(shí)需要到指定發(fā)送到哪個(gè)channel上,消費(fèi)者訂閱這個(gè)channel就能獲取到消息。圖中channel理解成MQ中的topic。 并且在Redis中,有很多默認(rèn)的channel,只不過向這些channel發(fā)送消息的生產(chǎn)者不是我們寫的代碼,而是Redis本身。這里面就有

    2024年02月13日
    瀏覽(28)
  • 生成訂單30分鐘未支付,則自動(dòng)取消,該怎么實(shí)現(xiàn)?

    生成訂單30分鐘未支付,則自動(dòng)取消,該怎么實(shí)現(xiàn)?

    今天給大家上一盤硬菜,并且是支付中非常重要的一個(gè)技術(shù)解決方案,有這塊業(yè)務(wù)的同學(xué)注意自己試一把了哈! 在開發(fā)中,往往會(huì)遇到一些關(guān)于延時(shí)任務(wù)的需求。例如 生成訂單30分鐘未支付,則自動(dòng)取消 生成訂單60秒后,給用戶發(fā)短信 對(duì)上述的任務(wù),我們給一個(gè)專業(yè)的名字來

    2024年02月09日
    瀏覽(33)
  • Spring Boot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的策略

    Spring Boot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的策略

    ??歡迎來到架構(gòu)設(shè)計(jì)專欄~Spring Boot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的策略 ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:架構(gòu)設(shè)計(jì) ??其他專欄:Java學(xué)習(xí)路線 Java面試技巧 Java實(shí)戰(zhàn)項(xiàng)目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí) ??文章作者技術(shù)和水平有限,

    2024年02月08日
    瀏覽(31)
  • 使用RabbitMQ死信隊(duì)列關(guān)閉未支付的訂單

    使用RabbitMQ死信隊(duì)列關(guān)閉未支付的訂單

    RabbitMQ死信隊(duì)列(Dead-Letter Exchange,簡(jiǎn)稱DLX)是一種特殊類型的交換機(jī),用于處理在隊(duì)列中無法被消費(fèi)的消息。當(dāng)消息無法被消費(fèi)時(shí),它會(huì)被轉(zhuǎn)發(fā)到死信隊(duì)列中,以便進(jìn)一步處理。 在RabbitMQ中,死信隊(duì)列通常用于處理以下情況: 消息無法被消費(fèi)者處理:例如,如果消費(fèi)者崩潰

    2024年02月11日
    瀏覽(21)
  • 設(shè)置RabbitMQ超時(shí)時(shí)間

    RabbitMQ默認(rèn)的超時(shí)時(shí)間是30分鐘,在消息消費(fèi)超過30分鐘后,rabbitMQ會(huì)發(fā)生錯(cuò)誤,導(dǎo)致整個(gè)channel被銷毀,無法繼續(xù)消費(fèi) 在RabbitMQ安裝的終端執(zhí)行 命令,將超時(shí)時(shí)間延長(zhǎng)。 使用 可以查看設(shè)置的超時(shí)值。 值得注意的是,這個(gè)事臨時(shí)更改,永久更改需要進(jìn)入 rabbitmq.con f 文件里修改

    2024年02月04日
    瀏覽(36)
  • Springboot與RabbitMQ消息超時(shí)時(shí)間、隊(duì)列消息超時(shí)時(shí)間

    TTL是 Time-To-Live 的縮寫,RabbitMQ可以對(duì)消息和隊(duì)列設(shè)置TTL(過期時(shí)間)。 RabbitMQ針對(duì)隊(duì)列中的消息過期時(shí)間(Time To Live, TTL)有兩種方法可以設(shè)置。 第一種方法是通過隊(duì)列屬性設(shè)置,隊(duì)列中所有消息都有相同的過期時(shí)間。 第二種方法是對(duì)消息進(jìn)行單獨(dú)設(shè)置,每條消息TTL可以不同。

    2024年02月09日
    瀏覽(23)
  • SpringBoot實(shí)現(xiàn)RabbitMQ的簡(jiǎn)單隊(duì)列(SpringAMQP 實(shí)現(xiàn)簡(jiǎn)單隊(duì)列)

    SpringBoot實(shí)現(xiàn)RabbitMQ的簡(jiǎn)單隊(duì)列(SpringAMQP 實(shí)現(xiàn)簡(jiǎn)單隊(duì)列)

    SpringAMQP 是基于 RabbitMQ 封裝的一套模板,并且還利用 SpringBoot 對(duì)其實(shí)現(xiàn)了自動(dòng)裝配,使用起來非常方便。 SpringAmqp 的官方地址:https://spring.io/projects/spring-amqp 說明 : 1.Spring AMQP 是對(duì) Spring 基于 AMQP 的消息收發(fā)解決方案,它是一個(gè)抽象層,不依賴于特定的 AMQP Broker 實(shí)現(xiàn)和客戶端

    2024年04月13日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包