最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解rabbitmq使用springboot實(shí)現(xiàn)fanout模式

 更新時(shí)間:2023年07月10日 10:24:14   作者:p&f°  
這篇文章主要介紹了rabbitmq使用springboot實(shí)現(xiàn)fanout模式,Fanout特點(diǎn)是發(fā)布與訂閱模式,是一種廣播機(jī)制,它是沒(méi)有路由key的模式,需要的朋友可以參考下

一、fanout模式

  • 類型:fanout
  • 特點(diǎn):Fanout—發(fā)布與訂閱模式,是一種廣播機(jī)制,它是沒(méi)有路由key的模式。

 二、實(shí)現(xiàn)

1、引入相應(yīng)的pom文件 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.xpf</groupId>
    <artifactId>rabbitmq-springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rabbitmq-springboot</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <!--rabbitmq依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

2、配置文件 application.properties

server.port=8080
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=/
spring.rabbitmq.host=192.168.199.20
spring.rabbitmq.port=5672

3、使用springboot寫一個(gè)配置文件 RabbitMqConfiguration.java

(當(dāng)然此配置類就是用來(lái)聲明交換機(jī)類型以及交換機(jī)隊(duì)列綁定關(guān)系的,將此配置類放在生產(chǎn)者中,或者放在消費(fèi)者中都可以,或者兩邊都放。不管是生產(chǎn)者還是消費(fèi)者,當(dāng)生產(chǎn)者發(fā)送消息(或者消費(fèi)者監(jiān)聽隊(duì)列時(shí)),如果發(fā)現(xiàn)rabbitmq中沒(méi)有所發(fā)送的交換機(jī)(或者監(jiān)聽的隊(duì)列),都會(huì)根據(jù)此配置類自動(dòng)創(chuàng)建交換機(jī)和隊(duì)列以及綁定關(guān)系。但是一般建議下,放在消費(fèi)者會(huì)更好一些,因?yàn)橐话阆M(fèi)者在springboot系統(tǒng)啟動(dòng)時(shí),就會(huì)開啟監(jiān)聽,如果沒(méi)有相應(yīng)的rabbitmq連接有問(wèn)題能在項(xiàng)目啟動(dòng)時(shí)就發(fā)現(xiàn))

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfiguration {
    //1、聲明注冊(cè)fanout模式交換機(jī) (生產(chǎn)者發(fā)送消息給rabbitmq,其實(shí)就是發(fā)送到交換機(jī))
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanout_order_exchange", true, false);
    }
    //2、聲明隊(duì)列 sms.fanout.queue、email.fanout.queue、duanxin.fanout.queue
    @Bean
    public Queue smsQueue(){
        return new Queue("sms.fanout.queue", true);
    }
    @Bean
    public Queue emailQueue(){
        return new Queue("email.fanout.queue", true);
    }
    @Bean
    public Queue duanxinQueue(){
        return new Queue("duanxin.fanout.queue", true);
    }
    //3、完成綁定關(guān)系(隊(duì)列綁定交換機(jī))
    @Bean
    public Binding smsBinding(){
        return BindingBuilder.bind(smsQueue()).to(fanoutExchange());
    }
    @Bean
    public Binding emailBinding(){
        return BindingBuilder.bind(emailQueue()).to(fanoutExchange());
    }
    @Bean
    public Binding duanxinBinding(){
        return BindingBuilder.bind(duanxinQueue()).to(fanoutExchange());
    }
}

4、寫一個(gè)生產(chǎn)者 FanoutOrderService.java

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.UUID;
@Service
public class FanoutOrderService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    /**
     * 模擬用戶下單,發(fā)送消息給下游系統(tǒng)
     * @param user
     * @param num
     */
    public void makerOrder(String user,  int num){
        //1、查詢庫(kù)存是否有剩余
        //2、保存訂單
        String orderId = UUID.randomUUID().toString();
        System.out.println("訂單生產(chǎn)成功:" + orderId);
        //3、通過(guò)mq給下游系統(tǒng)發(fā)送消息(交換機(jī)的名字千萬(wàn)別寫錯(cuò),和上述配置類應(yīng)相同)
        String exchangeName = "fanout_order_exchange";
        String routingkey = "";
        rabbitTemplate.convertAndSend(exchangeName, routingkey, orderId);
        System.out.println("完成");
    }
}

5、到這一步就可以再寫一個(gè)測(cè)試類來(lái)測(cè)試生產(chǎn)者發(fā)送消息

import com.xpf.rabbitmqspringboot.service.DirectOrderService;
import com.xpf.rabbitmqspringboot.service.FanoutOrderService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class RabbitmqSpringbootApplicationTests {
    @Autowired
    private FanoutOrderService fanoutOrderService;
    @Autowired
    private DirectOrderService directOrderService;
    /**
     * Fanout模式生成者發(fā)送消息
     */
    @Test
    void setFanoutOrderService() {
        fanoutOrderService.makerOrder("用戶1", 10);
    }
}

發(fā)送完消息可以檢查rabbitmq是否生成新交換機(jī)fanout_order_exchange和三個(gè)隊(duì)列sms.fanout.queue、email.fanout.queue、duanxin.fanout.queue,以及是否有在三個(gè)隊(duì)列看到一條剛剛發(fā)送的消息(因?yàn)槭荈anout—發(fā)布與訂閱模式,是一種沒(méi)有路由key的廣播機(jī)制,所有隊(duì)列都能收到消息)

6、寫一個(gè)消費(fèi)者。(可以另啟一個(gè)springboot項(xiàng)目,模擬另外的系統(tǒng)來(lái)消費(fèi)我們發(fā)送的消息,也可像我一樣在原項(xiàng)目編寫,自己消費(fèi))

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/**
 * @Author xpf
 * @Date 2023/7/9 0:44
 * @Version 1.0
 * Fanout—發(fā)布與訂閱模式消費(fèi)者(廣播機(jī)制)
 */
@Component
@RabbitListener(queues = "sms.fanout.queue")
public class smsFanoutConsumer {
    @RabbitHandler
    public void receiveMessage(String message){
        System.out.println("接收到來(lái)自隊(duì)列sms.fanout.queue消息訂單的message是:" + message);
    }
}

這里寫了一個(gè)監(jiān)聽sms發(fā)送消息的消費(fèi)者,剩下兩個(gè)email和duanxin類似。

特別注意:如果生成者發(fā)送的消息是什么類型,消費(fèi)者接收時(shí),

public void receiveMessage(String message)方法中的參數(shù)應(yīng)該也是相同的類型,否則會(huì)報(bào)錯(cuò)。比如這里的string類型,因?yàn)樯a(chǎn)者發(fā)送的也是sting類型

直接啟動(dòng)會(huì)發(fā)現(xiàn)sms.fanout.queue隊(duì)列中的消息被消費(fèi)掉了

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

相關(guān)文章

  • Java中實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消功能(最新推薦)

    Java中實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消功能(最新推薦)

    本文介紹了Java中實(shí)現(xiàn)訂單超時(shí)自動(dòng)取消功能的幾種方法,包括定時(shí)任務(wù)、JDK延遲隊(duì)列、Redis過(guò)期監(jiān)聽、Redisson分布式延遲隊(duì)列、RocketMQ延遲消息和RabbitMQ死信隊(duì)列,每種方法都有其優(yōu)缺點(diǎn),可以根據(jù)具體需求選擇合適的方法,感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot整合Drools的實(shí)現(xiàn)步驟

    SpringBoot整合Drools的實(shí)現(xiàn)步驟

    Drools是一個(gè)易于訪問(wèn)企業(yè)策略、易于調(diào)整以及易于管理的開源業(yè)務(wù)規(guī)則引擎,符合業(yè)內(nèi)標(biāo)準(zhǔn),速度快、效率高。業(yè)務(wù)分析師或?qū)徍巳藛T可以利用它輕松查看業(yè)務(wù)規(guī)則,從而檢驗(yàn)是否已編碼的規(guī)則執(zhí)行所需的業(yè)務(wù)規(guī)則。本文將講述SpringBoot整合Drools的步驟
    2021-05-05
  • 關(guān)于Java的Condition接口最佳理解方式

    關(guān)于Java的Condition接口最佳理解方式

    這篇文章主要介紹了關(guān)于Java的Condition接口最佳理解方式,Condition就是實(shí)現(xiàn)了管程里面的條件變量,Java?語(yǔ)言內(nèi)置的管程里只有一個(gè)條件變量,而Lock&Condition實(shí)現(xiàn)的管程支持多個(gè)條件變量,需要的朋友可以參考下
    2023-05-05
  • 基于Java語(yǔ)言開發(fā)的一個(gè)高效的敏感詞過(guò)濾工具

    基于Java語(yǔ)言開發(fā)的一個(gè)高效的敏感詞過(guò)濾工具

    這篇文章主要為大家詳細(xì)介紹了如何基于Java語(yǔ)言開發(fā)的一個(gè)高效的敏感詞過(guò)濾工具,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考一下
    2025-01-01
  • Java多態(tài)和實(shí)現(xiàn)接口的類的對(duì)象賦值給接口引用的方法(推薦)

    Java多態(tài)和實(shí)現(xiàn)接口的類的對(duì)象賦值給接口引用的方法(推薦)

    下面小編就為大家?guī)?lái)一篇Java多態(tài)和實(shí)現(xiàn)接口的類的對(duì)象賦值給接口引用的方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-02-02
  • Java Files和Paths的使用demo詳解

    Java Files和Paths的使用demo詳解

    Java Files和Paths是Java 7中引入的新API,用于處理文件和目錄,F(xiàn)iles類提供了許多有用的靜態(tài)方法來(lái)操作文件和目錄,而Path類則表示文件系統(tǒng)中的路徑,這篇文章主要介紹了Java Files和Paths的使用詳解,需要的朋友可以參考下
    2023-03-03
  • Java對(duì)稱加密工作模式原理詳解

    Java對(duì)稱加密工作模式原理詳解

    這篇文章主要介紹了Java對(duì)稱加密工作模式原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • MyBatis的@SelectProvider注解構(gòu)建動(dòng)態(tài)SQL方式

    MyBatis的@SelectProvider注解構(gòu)建動(dòng)態(tài)SQL方式

    這篇文章主要介紹了MyBatis的@SelectProvider注解構(gòu)建動(dòng)態(tài)SQL方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java Map 原理、實(shí)現(xiàn)與使用場(chǎng)景分析

    Java Map 原理、實(shí)現(xiàn)與使用場(chǎng)景分析

    文章詳細(xì)介紹了Java中的Map接口及其主要實(shí)現(xiàn)類,包括HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap和Properties,涵蓋了Map的原理、核心方法、常見使用場(chǎng)景、遍歷方式以及注意事項(xiàng),感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • SWT(JFace) 打印功能

    SWT(JFace) 打印功能

    SWT(JFace)體驗(yàn)之打印功能
    2009-06-06

最新評(píng)論

仁化县| 长泰县| 抚顺市| 定州市| 泸水县| 大城县| 紫云| 望都县| 慈溪市| 乐至县| 武威市| 奉贤区| 黑龙江省| 闵行区| 壶关县| 桃园县| 元谋县| 深圳市| 漳浦县| 太康县| 冀州市| 梁平县| 土默特左旗| 延川县| 新乡县| 阿尔山市| 通州市| 边坝县| 喀喇沁旗| 丹寨县| 洛宁县| 团风县| 西乌珠穆沁旗| 滁州市| 石景山区| 鹿邑县| 英德市| 伊吾县| 澄迈县| 青河县| 宜城市|