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

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

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

一、fanout模式

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

 二、實現(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寫一個配置文件 RabbitMqConfiguration.java

(當(dāng)然此配置類就是用來聲明交換機類型以及交換機隊列綁定關(guān)系的,將此配置類放在生產(chǎn)者中,或者放在消費者中都可以,或者兩邊都放。不管是生產(chǎn)者還是消費者,當(dāng)生產(chǎn)者發(fā)送消息(或者消費者監(jiān)聽隊列時),如果發(fā)現(xiàn)rabbitmq中沒有所發(fā)送的交換機(或者監(jiān)聽的隊列),都會根據(jù)此配置類自動創(chuàng)建交換機和隊列以及綁定關(guān)系。但是一般建議下,放在消費者會更好一些,因為一般消費者在springboot系統(tǒng)啟動時,就會開啟監(jiān)聽,如果沒有相應(yīng)的rabbitmq連接有問題能在項目啟動時就發(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、聲明注冊fanout模式交換機 (生產(chǎn)者發(fā)送消息給rabbitmq,其實就是發(fā)送到交換機)
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("fanout_order_exchange", true, false);
    }
    //2、聲明隊列 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)系(隊列綁定交換機)
    @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、寫一個生產(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、查詢庫存是否有剩余
        //2、保存訂單
        String orderId = UUID.randomUUID().toString();
        System.out.println("訂單生產(chǎn)成功:" + orderId);
        //3、通過mq給下游系統(tǒng)發(fā)送消息(交換機的名字千萬別寫錯,和上述配置類應(yīng)相同)
        String exchangeName = "fanout_order_exchange";
        String routingkey = "";
        rabbitTemplate.convertAndSend(exchangeName, routingkey, orderId);
        System.out.println("完成");
    }
}

5、到這一步就可以再寫一個測試類來測試生產(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是否生成新交換機fanout_order_exchange和三個隊列sms.fanout.queue、email.fanout.queue、duanxin.fanout.queue,以及是否有在三個隊列看到一條剛剛發(fā)送的消息(因為是Fanout—發(fā)布與訂閱模式,是一種沒有路由key的廣播機制,所有隊列都能收到消息)

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

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ā)布與訂閱模式消費者(廣播機制)
 */
@Component
@RabbitListener(queues = "sms.fanout.queue")
public class smsFanoutConsumer {
    @RabbitHandler
    public void receiveMessage(String message){
        System.out.println("接收到來自隊列sms.fanout.queue消息訂單的message是:" + message);
    }
}

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

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

public void receiveMessage(String message)方法中的參數(shù)應(yīng)該也是相同的類型,否則會報錯。比如這里的string類型,因為生產(chǎn)者發(fā)送的也是sting類型

直接啟動會發(fā)現(xiàn)sms.fanout.queue隊列中的消息被消費掉了

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

相關(guān)文章

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

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

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

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

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

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

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

    基于Java語言開發(fā)的一個高效的敏感詞過濾工具

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

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

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

    Java Files和Paths的使用demo詳解

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

    Java對稱加密工作模式原理詳解

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

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

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

    Java Map 原理、實現(xiàn)與使用場景分析

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

    SWT(JFace) 打印功能

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

最新評論

郧西县| 巴中市| 永泰县| 木里| 鸡泽县| 白玉县| 五指山市| 灵川县| 青铜峡市| 安阳县| 衢州市| 巴塘县| 镇安县| 阿拉善右旗| 南丰县| 襄城县| 兴安盟| 定边县| 孟津县| 乳山市| 磐石市| 澎湖县| 江西省| 连云港市| 板桥市| 海阳市| 西乡县| 和平县| 仪陇县| 乳源| 曲麻莱县| 城市| 宾阳县| 安西县| 沂水县| 济宁市| 朝阳区| 拜泉县| 泸水县| 南康市| 商丘市|