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
  • MQTTnet 是一個高性能的MQTT類庫,支持.NET Core和.NET Framework。 MQTTnet 原理: MQTTnet 是一個用於.NET的高性能MQTT類庫,實現了MQTT協議的各個層級,包括連接、會話、發佈/訂閱、QoS(服務質量)等。其原理涉及以下關鍵概念: MqttCli ...
  • 在WPF中,源屬性(Source Property)指的是提供數據的屬性,通常是數據模型或者其他控制項的屬性,而目標屬性(Target Property)則是數據綁定的目標,通常是綁定到控制項的屬性,例如TextBlock的Text屬性。數據綁定將源屬性的值自動更新到目標屬性中。 主要包含以下幾個事件: ...
  • async/await 是 C# 中非同步編程的關鍵特性,它使得非同步代碼編寫更為簡單和直觀。下麵深入詳細描述了 async/await 的使用場景、優點以及一些高級使用方法,並提供了相應的實例源代碼。 使用場景: I/O 操作: 非同步編程特別適用於涉及 I/O 操作(如文件讀寫、網路請求等)的場景。在 ...
  • 使用過office的visio軟體畫圖的小伙伴都知道,畫圖軟體分為兩部分,左側圖形庫,存放各種圖標,右側是一個畫布,將左側圖形庫的圖標控制項拖拽到右側畫布,就會生成一個新的控制項,並且可以自由拖動。那如何在WPF程式中,實現類似的功能呢?今天就以一個簡單的小例子,簡述如何在WPF中實現控制項的拖拽和拖動,... ...
  • 1、Blazor Hybrid簡介 Blazor Hybrid 使開發人員能夠將桌面和移動本機客戶端框架與 .NET 和 Blazor 結合使用。在 Blazor Hybrid 應用中,Razor 組件在設備上是本機運行的。 這些組件通過本地互操作通道呈現到嵌入式 Web 視圖控制項。 組件不在瀏覽器 ...
  • 除了內置的數據集,scikit-learn還提供了隨機樣本的生成器。通過這些生成器函數,可以生成具有特定特性和分佈的隨機數據集,以幫助進行機器學習演算法的研究、測試和比較。 目前,scikit-learn庫(v1.3.0版)中有20個不同的生成樣本的函數。本篇重點介紹其中幾個具有代表性的函數。 1. ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------002實現通過文件對話框,選擇合適的文件夾,自定義預設的圖片保存位置,簡單易學 ...
  • 每次談到容器的時候,除了Docker之外,都會說起 Kubernetes,那麼什麼是 Kubernetes呢?今天就來一起學快速入門一下 Kubernetes 吧!希望本文對您有所幫助。 Kubernetes,一種用於管理和自動化雲中容器化工作負載的工具。 想象一下你有一個管弦樂隊,將每個音樂家視為 ...
  • 目錄 基本說明 安裝 Nginx 部署 VUE 前端 部署 Django 後端 Django admin 靜態文件(CSS,JS等)丟失的問題 總結 1. 基本說明 本文介紹了在 windows 伺服器下,通過 Nginx 部署 VUE + Django 前後端分離項目。本項目前端運行在 80 埠 ...
  • 從0到1,手把手帶你開發截圖工具ScreenCap------003實現最小化程式到托盤運行,- 為了方便截圖乾凈,實現最小化程式到托盤運行,簡潔,勿擾,實現最小化程式到托盤運行, 實現托盤菜單功能,實現回顯主窗體, 實現托盤開始截屏, 實現氣泡信息提示,實現托盤程式提示,實現托盤退出程式, 封裝完... ...