SpringBoot整合RabbitMQ

来源:https://www.cnblogs.com/aitiknowledge/archive/2022/08/12/16580151.html
-Advertisement-
Play Games

首先你需要安裝RabbitMQ,安裝教程可百度查下資料即可,不做贅述,敬請諒解 啟動RabbitMQ RabbitMQ可以算是一個非同步消息隊列,在實際的開發項目中,一般是以工具模塊的方式創建,像一些SpringBoot工程所需要的基本依賴都是會有的 說明:關鍵在於誰是消息的生產者、消息的消費者;另外 ...


  • 首先你需要安裝RabbitMQ,安裝教程可百度查下資料即可,不做贅述,敬請諒解
  • 啟動RabbitMQ
  • RabbitMQ可以算是一個非同步消息隊列,在實際的開發項目中,一般是以工具模塊的方式創建,像一些SpringBoot工程所需要的基本依賴都是會有的
  • 說明:關鍵在於誰是消息的生產者、消息的消費者;另外還需要註意生產消費之間消息類型的傳遞
  • 創建一個maven工程,導入RabbitMQ相關的依賴
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
    </dependency>
</dependencies>
  • 編寫一個簡單的配置類,配置消息轉換器
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
    /**
     * 配置消息轉換器,預設是字元串轉換器
     * @return MessageConverter
     */
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}
  • 編寫一個常量類
public class RabbitConstant {
    /** 簡訊發送 */
    public static final String EXCHANGE_DIRECT_MSM = "exchange.direct.msm";
    public static final String ROUTING_MSM = "msm";
    public static final String QUEUE_MSM = "queue.msm";
}
  • 在編寫一個簡單的生產消息的封裝類
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class RabbitService {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 生產消息到RabbitMQ中
     * @param exchange 交換機
     * @param routingKey 路由Key
     * @param message 任意類型的消息
     * @return boolean
     */
    public boolean sendMessage(String exchange, String routingKey, Object message) {
        rabbitTemplate.convertAndSend(exchange, routingKey, message);
        return true;
    }
}
  • 雖說一個簡單的整合就這麼幾步,主要還是實操示例,這裡以下單成功,通過手機發送消息通知為示例
  • 還需要在創建一個工程(接觸過微服務項目,很容易瞭解不同模塊有需要放在不同的服務下,便於管理)
  • 既然涉及手機簡訊發消息,可參考SpringBoot整合阿裡雲簡訊服務
  • 在手機簡訊服務中導入消息隊列模塊,所以在原有的基礎上添加配置文件
#rabbitmq地址
spring.rabbitmq.host=your_ip
spring.rabbitmq.port=5672
spring.rabbitmq.username=your_username
spring.rabbitmq.password=your_password
  • 封裝手機發送消息,和手機發送驗證碼業務代碼相似。
@Service
public class MsmServiceImpl implements MsmService {
    @Override
    public boolean orderConfirm(Map<String, Object> param) {
        if (StringUtils.isEmpty(param.get("phone"))) return false;
        // 整合阿裡雲簡訊服務,設置相關參數
        DefaultProfile profile = DefaultProfile.
                getProfile(ConstantPropertiesUtils.REGION_ID,
                        ConstantPropertiesUtils.ACCESS_KEY,
                        ConstantPropertiesUtils.ACCESS_SECRET);
        IAcsClient client = new DefaultAcsClient(profile);
        
        SendSmsRequest request = new SendSmsRequest();
        request.setPhoneNumbers(param.get("phone"));//接收簡訊的手機號碼
        request.setSignName(ConstantPropertiesUtils.SIGN_NAME);//簡訊簽名名稱
        request.setTemplateCode(ConstantPropertiesUtils.TEMPLATE_CODE);//簡訊模板CODE
        
        // 使用json格式   {"msg":"下單成功"}
        request.setTemplateParam(JSONObject.toJSONString(param));//簡訊模板變數對應的實際值
        
        try {
            SendSmsResponse response = client.getAcsResponse(request);
            // 發送簡訊,儘量列印出來是否發送成功
            new Gson().toJson(response);
        } catch (ClientException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}
  • 在當前簡訊服務模塊中創建一個RabbitMQ消息監聽(可以理解為消息的消費者)
import com.rabbitmq.client.Channel;
import com.xsha.msg.service.MsgService;
import com.xsha.rabbit.constant.RabbitConstant;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MsgReceive {
    @Autowired
    private MsgService msgService;

    /** 消息監聽:監聽到RabbitMQ中有消息就消費,並通過手機發送簡訊通知 */
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = RabbitConstant.QUEUE_MSM, durable = "true"),
            exchange = @Exchange(value = RabbitConstant.EXCHANGE_DIRECT_MSM),
            key = {RabbitConstant.ROUTING_MSM}
    ))
    public void orderConfirm(Map<String, Object> param, Message message, Channel channel) {
        msgService.orderConfirm(param);
    }
}
  • 由於涉及訂單,所以訂單是一個獨立的服務模塊,即導入消息隊列模塊,在原有的基礎上添加配置文件
#rabbitmq地址
spring.rabbitmq.host=your_ip
spring.rabbitmq.port=5672
spring.rabbitmq.username=your_username
spring.rabbitmq.password=your_password
  • 在實際開發中,用戶下單並不會立即通知用戶下單成功,而是通過非同步的方式稍後告知用戶下單成功。簡單示例,不可鑽牛角尖
  • 生成訂單業務(不考慮庫存),就是消息的生產者
@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private RabbitService rabbitService;
    @Override
    public void saveOrder(String userId, String id) {
        
        UserInfo userInfo = userInfoService.selectById(userId);
        String phone = userInfo.getPhone();
        // 簡訊信息封裝(根據業務需求,封裝重要信息)
        Map<String,Object> param = new HashMap<String,Object>(){{
            put("title", "消息標題");
            put("phone", phone);
            put("message", "下單成功");
            put("name", userInfo.getName());
            put("currentTime", new DateTime().toString("yyyy-MM-dd HH:mm"));
        }};
        // 生產消息
        rabbitService.sendMessage(RabbitConstant.EXCHANGE_DIRECT_MSM, RabbitConstant.ROUTING_MSM, param);
    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、cffi cffi是連接Python與c的橋梁,可實現在Python中調用c文件。cffi為c語言的外部介面,在Python中使用該介面可以實現在Python中使用外部c文件的數據結構及函數。 二、直接在python中通過cffi定義c函數並使用 1、先通過pip3安裝cffi : pip3 i ...
  • 後面的ssm三個框架學的比較潦草,只要是這些東西都是一些配置文件和一些文件的固定寫法這些東西只有在老一點的軟體會用,現在大多數的都是用的springboot的寫的在後面的代碼審計裡面再去慢慢研究這些框架,這樣無實戰的敲框架代碼意義不大,框架學的潦草因為我是學安全的不是學開發的就算以後開發以是用spr... ...
  • 作者:ThinkingKeep 鏈接:https://juejin.cn/post/7118954784853327903 細心的朋友應該會發現,最近,繼新浪微博之後,頭條、騰訊、抖音、知乎、快手、小紅書等各大平臺陸陸續續都上線了“網路用戶IP地址顯示功能”,境外用戶顯示的是國家,國內的用戶顯示的省 ...
  • 多商戶商城系統,也稱為B2B2C(BBC)平臺電商模式多商家商城系統。可以快速幫助企業搭建類似拼多多/京東/天貓/淘寶的綜合商城。 多商戶商城系統支持商家入駐加盟,同時滿足平臺自營、旗艦店等多種經營方式。平臺可以通過收取商家入駐費,訂單交易服務費,提現手續費,簡訊通道費等多手段方式,實現整體盈利。 ...
  • 1、前言 在自動化測試過程中經常需要進行初始化和後期處理等工作,如電商加購物車測試需要先登錄,測試完畢需要關閉瀏覽器等。Pytest提供了5種類型的setup和teardown的方法,具體如下: 模塊級別:setup_module,teardown_module 函數級別:setup_functio ...
  • 一、簡介 1.什麼是MyBatis MyBatis 是一款優秀的持久層框架 它支持自定義 SQL、存儲過程以及高級映射。 MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。 MyBatis 可以通過簡單的 XML 或註解來配置和映射原始類型、介面和 Java POJO( ...
  • 在一個項目的開發過程中,通常伴隨著多套環境:本地環境 local、開發環境 dev、集成測試環境 test、用戶接受測試環境 uat、預生產環境 pre、生產環境 prod。本節的內容有些脫離真實企業開發,因為在真實的企業開發中,不會只開發一個獨立的服務,而是多個微服務。發展至今,雲原生也越來越普遍... ...
  • 《Python編程從入門到實踐》(第二版)免費下載地址~~ 內容簡介 · · · · · · 本書是針對所有層次Python讀者而作的Python入門書。全書分兩部分:第一部分介紹用Python編程所必須瞭解的基本概念,包括Matplotlib等強大的Python庫和工具,以及列表、字典、if語句、 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...