国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot整合RabbitMQ之發(fā)布與訂閱模式

這篇具有很好參考價值的文章主要介紹了Spring Boot整合RabbitMQ之發(fā)布與訂閱模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

RabbitMQ的模式中,常用的模式有:簡單模式,發(fā)布與訂閱模式,工作模式,路由模式,主題模式。簡單模式不太會運用到工作中,我們可以使用 RabbitMQ 的發(fā)布訂閱模式,實現(xiàn):

  1. 用戶發(fā)布動態(tài),其“粉絲”收到其發(fā)布動態(tài)的消息
  2. 用戶下訂單,庫存模塊、支付模塊等收到消息并處理
  3. 等等

1. 創(chuàng)建RabbitMQ的生產(chǎn)者

創(chuàng)建一個springboot項目,項目創(chuàng)建idea的默認(rèn)創(chuàng)建springboot項目

Spring Boot整合RabbitMQ之發(fā)布與訂閱模式,消息隊列rabbitmq,java-rabbitmq,spring boot,rabbitmq

然后進(jìn)行rabbitMq的整合過程

1.1 引入rabbitmq的jar包

在項目的pom.xml中引入rabbitmq的jar包,詳情如下:

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

1.2 配置文件中添加配置

在項目的配置文件中添加rabbitmq的相關(guān)配置,配置詳情如下:

server:
  port: 10001
 
# rabbitMq 相關(guān)配置
spring:
  application:
    name: springboot-rabbitmq-s1
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    virtual-host: /
    username: guest
    password: guest

guest是rabbitmq的默認(rèn)密碼,不需要重新設(shè)置,不過在生產(chǎn)中為了安全是需要改密碼的
1.3 創(chuàng)建配置類

配置類用于將隊列和交換機進(jìn)行綁定,該操作也可以使用rabbitmq的管理界面操作,并不是一定需要的步驟。配置類詳情如下:

package com.study.rabbitmq.config;
 
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;
 
/**
 * @Author alen
 * @DATE 2022/6/7 23:50
 */
@Configuration
public class RabbitMQConfig {
 
    public static final String EXCHANGE_NAME = "fanout-order-exchange";
    public static final String SMS_QUEUE = "sms-fanout-queue";
    public static final String EMAIL_QUEUE = "email-fanout-queue";
    public static final String WECHAT_QUEUE = "wechat-fanout-queue";
 
    /**
     * 1.
     * 聲明交換機
     * @return
     */
    @Bean
    public FanoutExchange fanoutExchange() {
        /**
         * FanoutExchange的參數(shù)說明:
         * 1. 交換機名稱
         * 2. 是否持久化 true:持久化,交換機一直保留, false:不持久化,用完就刪除
         * 3. 是否自動刪除 false:不自動刪除, true:自動刪除
         */
        return new FanoutExchange(EXCHANGE_NAME, true, false);
    }
 
    /**
     * 2.
     * 聲明隊列
     * @return
     */
    @Bean
    public Queue smsQueue() {
        /**
         * Queue構(gòu)造函數(shù)參數(shù)說明
         * 1. 隊列名
         * 2. 是否持久化 true:持久化, false:不持久化
         */
        return new Queue(SMS_QUEUE, true);
    }
 
    @Bean
    public Queue emailQueue() {
        return new Queue(EMAIL_QUEUE, true);
    }
 
    @Bean
    public Queue wechatQueue() {
        return new Queue(WECHAT_QUEUE, true);
    }
 
    /**
     * 3.
     * 隊列與交換機綁定
     */
    @Bean
    public Binding smsBinding() {
        return BindingBuilder.bind(smsQueue()).to(fanoutExchange());
    }
 
    @Bean
    public Binding emailBinding() {
        return BindingBuilder.bind(emailQueue()).to(fanoutExchange());
    }
 
    @Bean
    public Binding wechatBinding() {
        return BindingBuilder.bind(wechatQueue()).to(fanoutExchange());
    }
}

1.4 模擬發(fā)送消息

創(chuàng)建一個service類,在類中進(jìn)行rabbitMq消息的發(fā)送,源碼如下:

package com.study.rabbitmq.service;
 
import cn.hutool.json.JSONUtil;
import com.study.rabbitmq.entity.Order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
/**
 * @Author alen
 * @DATE 2022/6/7 23:31
 */
@Service
@Slf4j
public class OrderService {
 
    @Autowired
    private RabbitTemplate rabbitTemplate;
 
    public void createOrder(Order order) {
        String body = JSONUtil.toJsonStr(order);
        log.info("訂單信息:{}", body);
        //交換機名稱
        String exchangeName = "fanout-order-exchange";
        //路由key 由于我們實現(xiàn)的是fanout模式(廣播模式),不需要路由key,所有的消費者都可以進(jìn)行監(jiān)聽和消費
        String routeKey = "";
        //發(fā)送mq消息
        rabbitTemplate.convertAndSend(exchangeName, routeKey, body);
        log.info("rabbitmq發(fā)送廣播模式消息成功。。。");
    }
}

使用單元測試模擬消息發(fā)送,單元測試詳情如下:

package com.study.rabbitmq;
 
import com.study.rabbitmq.entity.Order;
import com.study.rabbitmq.service.OrderService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
 
import java.util.UUID;
 
@SpringBootTest
class SpringbootRabbitmqS1ApplicationTests {
 
    @Autowired
    private OrderService orderService;
 
    @Test
    void contextLoads() {
        for (long i = 1; i < 50; i++) {
            Order order = new Order();
            order.setRequestId(i);
            order.setUserId(i);
            order.setOrderNo(UUID.randomUUID().toString());
            order.setAmount(10L);
            order.setGoodsNum(1);
            order.setTotalAmount(10L);
            orderService.createOrder(order);
        }
    }
}

發(fā)送完后,我們可以在rabbitMq的管理后臺看到已經(jīng)發(fā)送成功的消息,效果如下:

Spring Boot整合RabbitMQ之發(fā)布與訂閱模式,消息隊列rabbitmq,java-rabbitmq,spring boot,rabbitmq

可見消息已經(jīng)全部發(fā)送完畢,因為前面的三個隊列都是綁定在同一個交換機上,所以三個隊列都會收到消息。

2. 創(chuàng)建RabbitMQ的消費者

創(chuàng)建消費者服務(wù)S2,項目結(jié)構(gòu)參考生產(chǎn)者項目結(jié)構(gòu),然后進(jìn)行消息消費的相關(guān)代碼的實現(xiàn),實現(xiàn)過程如下

2.1 引入RabbitMQ的jar包

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

2.2 在項目配置文件中添加配置

配置詳情如下

server:
  port: 10002
 
# rabbitmq 相關(guān)配置
spring:
  application:
    name: springboot-rabbitmq-s2
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    virtual-host: /
    username: admin
    password: admin

2.3 創(chuàng)建MQ消息消費者

消費者類詳情如下

package com.study.rabbitmq.service;
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
 
/**
 * @Author alen
 * @DATE 2022/6/8 8:15
 */
@Slf4j
@Service
@RabbitListener(queues = {"email-fanout-queue"}) //監(jiān)聽隊列
public class FanoutEmailConsumer {
 
    @RabbitHandler
    public void emailMessage(String message) {
        log.info("Email fanout --接收到消息:{}", message);
    }
}

啟動消費者項目,消費效果如下:

Spring Boot整合RabbitMQ之發(fā)布與訂閱模式,消息隊列rabbitmq,java-rabbitmq,spring boot,rabbitmq

登錄rabbitMq后臺查看隊列的消息情況如下

Spring Boot整合RabbitMQ之發(fā)布與訂閱模式,消息隊列rabbitmq,java-rabbitmq,spring boot,rabbitmq 到此,似乎感覺整合得很順利,沒啥毛病。但是實際的運用中,以上演示過程中忽略了兩個很重要的問題,一是我如何知道消息被順利的發(fā)送到了隊列,因為實際的工作中,不大可能每個消息都去rabbitmq管理后臺查看。二是如果消息在消費的過程中出現(xiàn)了異常導(dǎo)致消息丟失,不重要的數(shù)據(jù)還好,如果是支付類的消息呢?就會產(chǎn)生嚴(yán)重的線上問題。那么這兩個問題需要怎么處理呢?其實rabbitmq提供了消息發(fā)送結(jié)果回調(diào)和消息消費手動確認(rèn)來處理這兩個問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-660941.html

到了這里,關(guān)于Spring Boot整合RabbitMQ之發(fā)布與訂閱模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Spring Boot 3】【Redis】消息發(fā)布及訂閱

    軟件開發(fā)是一門實踐性科學(xué),對大多數(shù)人來說,學(xué)習(xí)一種新技術(shù)不是一開始就去深究其原理,而是先從做出一個可工作的DEMO入手。但在我個人學(xué)習(xí)和工作經(jīng)歷中,每次學(xué)習(xí)新技術(shù)總是要花費或多或少的時間、檢索不止一篇資料才能得出一個可工作的DEMO,這占用了我大量的時

    2024年01月21日
    瀏覽(22)
  • Redis的發(fā)布訂閱模式:實現(xiàn)消息隊列和實時數(shù)據(jù)推送的利器

    當(dāng)涉及到實時數(shù)據(jù)推送和消息隊列時,Redis的發(fā)布訂閱模式是一種非常有用的工具。Redis是一個開源的內(nèi)存數(shù)據(jù)庫,被廣泛用于緩存、隊列和實時數(shù)據(jù)處理等方面。 在本博客中,我們將重點介紹Redis的發(fā)布訂閱模式,并且提供一些示例代碼來幫助讀者更好地理解這個模式以及如

    2024年02月12日
    瀏覽(24)
  • 消息隊列——spring和springboot整合rabbitmq

    消息隊列——spring和springboot整合rabbitmq

    目錄 spring整合rabbitmq——生產(chǎn)者 rabbitmq配置文件信息 倒入生產(chǎn)者工程的相關(guān)代碼 簡單工作模式 spring整合rabbitmq——消費者 spring整合rabbitmq——配置詳解 SpringBoot整合RabbitMQ——生產(chǎn)者 ?SpringBoot整合RabbitMQ——消費者 ? 使用原生amqp來寫應(yīng)該已經(jīng)沒有這樣的公司了 創(chuàng)建兩個工程

    2024年02月16日
    瀏覽(28)
  • Spring Boot 整合Redis實現(xiàn)消息隊列

    ??本篇文章主要來講Spring Boot 整合Redis實現(xiàn)消息隊列,實現(xiàn)redis用作消息隊列有多種方式,比如: 基于 List 的 rpush+lpop 或 lpush+rpop 基于 List 的 rpush+blpop 或 lpush+brpop (阻塞式獲取消息) 基于 Sorted Set 的優(yōu)先級隊列 Redis Stream (Redis5.0版本開始) Pub/Sub 機制 ??不過這里講的是

    2024年02月13日
    瀏覽(34)
  • RabbitMQ 消息隊列(Spring boot AMQP)

    RabbitMQ 消息隊列(Spring boot AMQP)

    幾種常見MQ的對比: RabbitMQ ActiveMQ RocketMQ Kafka 公司/社區(qū) Rabbit Apache 阿里 Apache 開發(fā)語言 Erlang Java Java ScalaJava 協(xié)議支持 AMQP,XMPP,SMTP,STOMP OpenWire,STOMP,REST,XMPP,AMQP 自定義協(xié)議 自定義協(xié)議 可用性 高 一般 高 高 單機吞吐量 一般 差 高 非常高 消息延遲 微秒級 毫秒級 毫秒級 毫

    2024年02月13日
    瀏覽(60)
  • 第三章 Spring Boot 整合 Kafka消息隊列 消息者

    第一章 Kafka 配置部署及SASL_PLAINTEXT安全認(rèn)證 第二章??Spring Boot 整合 Kafka消息隊列?生產(chǎn)者 第三章??Spring Boot 整合 Kafka消息隊列?消息者 ????????Kafka 是一個消息隊列產(chǎn)品,基于Topic partitions的設(shè)計,能達(dá)到非常高的消息發(fā)送處理性能。本文主是基于Spirng Boot封裝了Apache 的

    2024年02月22日
    瀏覽(15)
  • Spring Boot 整合 RabbitMQ 實現(xiàn)延遲消息

    Spring Boot 整合 RabbitMQ 實現(xiàn)延遲消息

    消息隊列(Message Queuing,簡寫為 MQ)最初是為了解決金融行業(yè)的特定業(yè)務(wù)需求而產(chǎn)生的。慢慢的,MQ 被應(yīng)用到了更多的領(lǐng)域,然而商業(yè) MQ 高昂的價格讓很多初創(chuàng)公司望而卻步,于是 AMQP(Advanced Message Queuing Protocol,高級消息隊列協(xié)議)應(yīng)運而生。 隨著 AMQP 草案的發(fā)布,兩個月

    2024年04月08日
    瀏覽(29)
  • springboot整合rabbitmq的發(fā)布確認(rèn),消費者手動返回ack,設(shè)置備用隊列,以及面試題:rabbitmq確保消息不丟失

    springboot整合rabbitmq的發(fā)布確認(rèn),消費者手動返回ack,設(shè)置備用隊列,以及面試題:rabbitmq確保消息不丟失

    目錄 1.生產(chǎn)者發(fā)消息到交換機時候的消息確認(rèn) 2.交換機給隊列發(fā)消息時候的消息確認(rèn) 3.備用隊列 3.消費者手動ack ? rabbitmq的發(fā)布確認(rèn)方式,可以有效的保證我們的數(shù)據(jù)不丟失。 ? 消息正常發(fā)送的流程是:生產(chǎn)者發(fā)送消息到交換機,然后交換機通過路由鍵把消息發(fā)送給對應(yīng)的隊

    2024年02月09日
    瀏覽(28)
  • 第二章 Spring Boot 整合 Kafka消息隊列 生產(chǎn)者

    第一章 Kafka 配置部署及SASL_PLAINTEXT安全認(rèn)證 第二章??Spring Boot 整合 Kafka消息隊列?生產(chǎn)者 第三章??Spring Boot 整合 Kafka消息隊列?消息者 ????????Kafka 是一個消息隊列產(chǎn)品,基于Topic partitions的設(shè)計,能達(dá)到非常高的消息發(fā)送處理性能。本文主是基于Spirng Boot封裝了Apache 的

    2024年01月25日
    瀏覽(18)
  • Spring整合RabbitMQ-配制文件方式-3-消息拉模式

    拉消息的消費者 spring-rabbit.xml 當(dāng)啟動消費者后,便可獲取到發(fā)送至隊列的消息 檢查隊列的消息的情況: 經(jīng)過檢查確認(rèn),發(fā)現(xiàn)消息已經(jīng)被消費了。 至此拉模式的消費者完成。

    2024年02月09日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包