欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用RabbitMQ實(shí)現(xiàn)異步秒殺

 更新時(shí)間:2025年04月11日 14:47:17   作者:starrismq  
這篇文章主要介紹了如何使用RabbitMQ實(shí)現(xiàn)異步秒殺,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

搭建RabbitMQ

在虛擬機(jī)上用docker搭建RabbitMQ,首先拉取鏡像

docker run --privileged=true -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
mkdir -p /usr/local/docker/rabbitmq

再創(chuàng)建rabbitmq容器,下面的命令已經(jīng)能夠創(chuàng)建之后直接啟動(dòng)了

docker run --privileged=true -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management

啟動(dòng)之后,在瀏覽器中輸入

http://192.168.200.130:15672/#/
->也就是http://你的虛擬機(jī)地址:15672

登錄的密碼以及賬號(hào)默認(rèn)都是guest

創(chuàng)建交換機(jī)以及queues

創(chuàng)建交換機(jī)

創(chuàng)建queues,名字為seckill.order.queue

創(chuàng)建好queue以及交換機(jī)后,回到交換機(jī)處,為交換機(jī)綁定一個(gè)queue,以便以后交換機(jī)接受到指定Rounting key的消息后,能夠?qū)⑿畔⒔唤o指定queue來消費(fèi)信息,實(shí)現(xiàn)消息隊(duì)列(也就是將訂單消息交給交換機(jī),交換機(jī)將消息給到queue,queue收到消息后就能消費(fèi)信息,使用訂單信息完成扣減庫(kù)存等)

在項(xiàng)目中應(yīng)用RabbitMQ

1 引入amqp依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2 配置連接信息

  rabbitmq:
    host: 192.168.238.128 # 你的虛擬機(jī)IP
    port: 5672 # 端口
    virtual-host: /dianping # 虛擬主機(jī)
    username: guest # 用戶名
    password: guest # 密碼
    listener:
      direct:
        acknowledge-mode: manual

3 添加序列化配置

自定義RabbitMQ中json格式的消息的序列化機(jī)制

@Configuration
public class RabbitMQConfig {
   @Bean
   public MessageConverter messageConverter() {
       return new Jackson2JsonMessageConverter();
   }
}

修改業(yè)務(wù)代碼

直接將訂單交給消息隊(duì)列RabbitMQ

消息發(fā)送者

    @Resource
    private RabbitTemplate rabbitTemplate;
    @Transactional
    public void handleVoucherOrder(VoucherOrder voucherOrder) {
        //1.所有信息從當(dāng)前消息實(shí)體中拿
        Long voucherId = voucherOrder.getVoucherId();
        //2.扣減庫(kù)存
        boolean success = seckillVoucherService.update().setSql("stock=stock-1")
                .eq("voucher_id", voucherId)
                //======判斷當(dāng)前庫(kù)存是否大于0就可以決定是否能搶池子中的券了
                .gt("stock", 0)
                .update();
        //3.創(chuàng)建訂單
        save(voucherOrder);
    }
    @Override
    public Result seckillVoucher(Long voucherId) {
        //1.執(zhí)行l(wèi)ua腳本,判斷當(dāng)前用戶的購(gòu)買資格
        Long userId = ThreadLocalUtls.getUser().getId();
        Long result = stringRedisTemplate.execute(
                SECKILL_SCRIPT,
                Collections.emptyList(),
                voucherId.toString(), userId.toString());
        if (result != 0) {
            //2.不為0說明沒有購(gòu)買資格
            return Result.fail(result==1?"庫(kù)存不足":"不能重復(fù)下單");
        }
        //3.走到這一步說明有購(gòu)買資格,將訂單信息存到阻塞隊(duì)列
        VoucherOrder voucherOrder = new VoucherOrder();
        long orderId = redisIdWorker.nextId("order");
        voucherOrder.setId(orderId);
        voucherOrder.setUserId(ThreadLocalUtls.getUser().getId());
        voucherOrder.setVoucherId(voucherId);
        //存入消息隊(duì)列等待異步消費(fèi)
        rabbitTemplate.convertAndSend("seckill.direct","seckill.order",voucherOrder);
        return Result.ok(orderId);
    }

消費(fèi)者
創(chuàng)建一個(gè)Listener文件夾,創(chuàng)建消費(fèi)者專門監(jiān)聽交換器,收到信息傳來的訂單就執(zhí)行處理訂單方法,調(diào)用VoucherOrderService中的handleVoucherOrder來處理訂單,下單并修改數(shù)據(jù)庫(kù)

@Component
public class SeckillOrderListener {
 @Autowired
 VoucherOrderServiceImpl voucherOrderService;
 @RabbitListener(queues = {"seckill.order.queue"})
 public void recieveMessage(Message message, Channel channel, VoucherOrder voucherOrder){
     try {
         voucherOrderService.handleVoucherOrder(voucherOrder);
         channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
     } catch (IOException e) {
         throw new RuntimeException(e);
     }
 }

到此這篇關(guān)于使用RabbitMQ實(shí)現(xiàn)異步秒殺的文章就介紹到這了,更多相關(guān)RabbitMQ異步秒殺內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • CommonMark 使用教程:將 Markdown 語(yǔ)法轉(zhuǎn)成 Html

    CommonMark 使用教程:將 Markdown 語(yǔ)法轉(zhuǎn)成 Html

    這篇文章主要介紹了CommonMark 使用教程:將 Markdown 語(yǔ)法轉(zhuǎn)成 Html,這個(gè)技巧我們做任何網(wǎng)站都可以用到,而且非常好用。,需要的朋友可以參考下
    2019-06-06
  • SpringBoo項(xiàng)目打war包的多種方式

    SpringBoo項(xiàng)目打war包的多種方式

    在idea中,經(jīng)常會(huì)對(duì)web項(xiàng)目進(jìn)行打jar包或者war包,jar包在Java環(huán)境中運(yùn)行,war包在Tomcat服務(wù)器中跑,對(duì)于打war包有多種方式,一下介紹3鐘方式,需要的朋友可以參考下
    2024-06-06
  • SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn)

    SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java對(duì)敏感數(shù)據(jù)進(jìn)行加密的方法詳解

    Java對(duì)敏感數(shù)據(jù)進(jìn)行加密的方法詳解

    敏感數(shù)據(jù)的加密是數(shù)據(jù)安全的重要方面,尤其是對(duì)于手機(jī)號(hào)和身份證號(hào)這類個(gè)人信息,本文主要為大家介紹了Java對(duì)敏感數(shù)據(jù)進(jìn)行加密的相關(guān)方法,希望對(duì)大家有所幫助
    2024-03-03
  • response.sendRedirect()實(shí)現(xiàn)重定向(頁(yè)面跳轉(zhuǎn))

    response.sendRedirect()實(shí)現(xiàn)重定向(頁(yè)面跳轉(zhuǎn))

    在Java web開發(fā)中,使用response.sendRedirect()可實(shí)現(xiàn)重定向功能。本文將介紹如何使用該方法進(jìn)行頁(yè)面跳轉(zhuǎn),以及該方法的使用場(chǎng)景和注意事項(xiàng),感興趣的可以了解一下
    2023-04-04
  • java.lang.IllegalArgumentException:Invalid character found異常解決

    java.lang.IllegalArgumentException:Invalid character&nb

    本文介紹了java.lang.IllegalArgumentException: Invalid character found異常的解決,方法包括檢查代碼中的方法名,使用合適的HTTP請(qǐng)求方法常量,使用第三方HTTP庫(kù),檢查請(qǐng)求URL以及使用調(diào)試和日志工具,通過這些方法,我們可以解決異常并確保網(wǎng)絡(luò)應(yīng)用程序的正常運(yùn)行
    2023-10-10
  • SpringBoot?快速實(shí)現(xiàn)?api?接口加解密功能

    SpringBoot?快速實(shí)現(xiàn)?api?接口加解密功能

    在項(xiàng)目中,為了保證數(shù)據(jù)的安全,我們常常會(huì)對(duì)傳遞的數(shù)據(jù)進(jìn)行加密,Spring?Boot接口加密,可以對(duì)返回值、參數(shù)值通過注解的方式自動(dòng)加解密,這篇文章主要介紹了SpringBoot?快速實(shí)現(xiàn)?api?接口加解密功能,感興趣的朋友一起看看吧
    2023-10-10
  • 聊聊DecimalFormat的用法及各符號(hào)的意義

    聊聊DecimalFormat的用法及各符號(hào)的意義

    這篇文章主要介紹了DecimalFormat的用法及各符號(hào)的意義,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java 實(shí)現(xiàn)將一個(gè)string保存到txt文檔中

    java 實(shí)現(xiàn)將一個(gè)string保存到txt文檔中

    今天小編就為大家分享一篇java 實(shí)現(xiàn)將一個(gè)string保存到txt文檔中的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Spring?boot?整合Logback過程示例解析

    Spring?boot?整合Logback過程示例解析

    這篇文章主要為大家介紹了Spring?boot?整合Logback的過程及示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論