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

【中間件】RabbitMQ 自定義重試次數(shù)(針對同一模塊不同消費者)

這篇具有很好參考價值的文章主要介紹了【中間件】RabbitMQ 自定義重試次數(shù)(針對同一模塊不同消費者)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

最近遇到了關于 RabbitMQ 的問題,打比方說:某個微服務模塊中,RabbitMQ 的大部分消費者需要重試兩次,而小部分消費者由于特殊原因并不需要進行重試。這就涉及到自定義重試次數(shù)的話題了,但在網(wǎng)上找了一圈沒發(fā)現(xiàn)相關的,但是功夫不負有心人,最后還是解決了這個問題,接下來給大家分享一下~

目錄

1 默認配置重試次數(shù)

2 自定義重試次數(shù)

2.1 消費者

①?配置文件

② 配置隊列,綁定交換機

③ 消費者文件

2.2 生產者

①?配置文件

② 生產者文件

③?測試文件

2.3 啟動測試文件


1 默認配置重試次數(shù)

一般來說,關于 RabbitMQ 的重試次數(shù)是直接在配置文件中進行定義(比如 application.yml),那么所有的消費者都將遵循這個配置條件,比如 ??

spring.application.name=spirng-boot-rabbitmq
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.listener.simple.retry.enabled=true # 開啟消費者重試機制
spring.rabbitmq.listener.simple.retry.max-attempts=3 # 最大重試次數(shù)
spring.rabbitmq.listener.simple.retry.initial-interval=3000 # 重試時間間隔

該配置中的 max-attempts 決定了消費者的重試次數(shù),不過有一點需求注意:max-attempts 指的是嘗試次數(shù),就是說最開始消費的那一次也是計算在內的,那么 max-attempts: 3 便是重試兩次,另外一次是正常消費~

同時消費者遵循的是本模塊的 RabbitMQ 配置,并不會讀取生產者的配置。打比方說,生產者模塊配置重試 3?次,而消費者模塊配置重試 1 次,那么生產者給消費者發(fā)送消息,消費者進行消費,如果觸發(fā)了重試,消費者也只會重試一次,它只遵循消費者模塊的配置??!

如上,默認配置重試次數(shù)就算完成了,但是并沒有實現(xiàn)針對不同消費者的自定義重試功能,請繼續(xù)看第二章內容。

2 自定義重試次數(shù)

以應用廣泛的訂閱模式為例,由于消費者和生產者配置不一,注意消費者和生產者不在同一模塊!因此分開闡述:

2.1 消費者

主要配置是在消費者這!!

①?配置文件

對于消費者來說,該配置不僅起到了連接作用,同時也啟動了重試機制,默認重試 2 次。

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.listener.simple.retry.enabled=true # 開啟消費者重試機制
spring.rabbitmq.listener.simple.retry.max-attempts=3 # 最大重試次數(shù)
spring.rabbitmq.listener.simple.retry.initial-interval=3000 # 重試時間間隔

② 配置隊列,綁定交換機

package com.yinyu.consumer.rabbitmq;

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;
import org.springframework.amqp.rabbit.config.RetryInterceptorBuilder;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.retry.RejectAndDontRequeueRecoverer;
import org.springframework.retry.interceptor.RetryOperationsInterceptor;


@Configuration
public class FanoutRabbitConfig {

    @Autowired
    private ConnectionFactory connectionFactory;
    
    //自定義工廠
    @Bean
    public SimpleRabbitListenerContainerFactory listenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setMessageConverter(jsonMessageConverter());
        factory.setConcurrentConsumers(3);
        factory.setMaxConcurrentConsumers(10);
        factory.setAdviceChain(retries());
        return factory;
    }

    @Bean
    public RetryOperationsInterceptor retries() {
        return RetryInterceptorBuilder.stateless()
                .maxAttempts(1) //設置最大嘗試次數(shù)為1(不重試)
                .backOffOptions(1000, 3.0, 10000)
                .recoverer(new RejectAndDontRequeueRecoverer()).build();
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public Queue retryTest1() {
        return new Queue("yinyu.retryTest1");
    }

    @Bean
    public Queue retryTest2() {
        return new Queue("yinyu.retryTest2");
    }
    
    @Bean
    public Exchange topicExchange() {
        return new TopicExchange("yinyu");//交換機命名
    }
    
    //隊列綁定交換機
    @Bean
    public List<Binding> allActivateBinding() {
        return Arrays.asList(BindingBuilder.bind(
                BindingBuilder.bind(retryTest1()).to(topicExchange()).with("yinyu.retryTest1").noargs(),
                BindingBuilder.bind(retryTest2()).to(topicExchange()).with("yinyu.retryTest2").noargs());
    }
}

③ 消費者文件

用于接收消息,設置了一個對照組,一個自定義配置,一個默認配置

package com.yinyu.consumer.rabbitmq;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class ReceiverA {

    @RabbitListener(queues = "yinyu.retryTest1", containerFactory = "listenerContainerFactory")
    public void retryReceiver1(Map<String,String> map) {
        log.info("retryTest 自定義配置開始, key: {}", map.get("key"));
        if (!Objects.equals(map.get("key"), "yinyu")){
            throw new RuntimeException("value 值匹配不準確,請重新進行請求??!");
        }
        log.info("retryTest 結束");
    }

    @RabbitListener(queues = "yinyu.retryTest2")
    public void retryReceiver2(Map<String,String> map) {
        log.info("retryTest 默認配置開始, key: {}", map.get("key"));
        if (!Objects.equals(map.get("key"), "yinyu")){
            throw new RuntimeException("value 值匹配不準確,請重新進行請求??!");
        }
        log.info("retryTest 結束");
    }

}

2.2 生產者

生產者不需要過多的配置,它的作用是發(fā)送消息

①?配置文件

寫在 application.properties 中,對于生產者來說奇起的是連接 rabbitmq 作用,如果它是調用其他模塊的消費者,那么這個重試配置是不起作用的。

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.listener.simple.retry.enabled=true # 開啟消費者重試機制
spring.rabbitmq.listener.simple.retry.max-attempts=5 # 最大重試次數(shù)
spring.rabbitmq.listener.simple.retry.initial-interval=3000 # 重試時間間隔

② 生產者文件

用于發(fā)送消息,

package com.yinyu.producer.rabbitmq;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

@Component
public class Sender {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void retryProducer1(){
        Map<String,String> map = new HashMap<>();
        map.put("key","yinyu自定義");
        rabbitTemplate.convertAndSend("yinyu", "yinyu.retryTest1", map);
    }

    public void retryProducer2(){
        Map<String,String> map = new HashMap<>();
        map.put("key","yinyu默認");
        rabbitTemplate.convertAndSend("yinyu", "yinyu.retryTest2", map);
    }   

}

③?測試文件

package com.yinyu.producer.rabbitmq;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SenderTest {

    @Autowired
    private Sender sender;

    //測試自定義配置
    @Test
    public void testCustomConfig() {
        sender.retryProducer1();
    }

    //測試默認配置
    @Test
    public void testDefaultConfig() {
        sender.retryProducer2();
    }

}

2.3 啟動測試文件

有條件的各位可以啟動一下生產者的測試文件中這兩個方法,最終結果:

  • retryProducer1 發(fā)送消息后,retryReceiver1 消費消息,雖然報錯,但沒有重試(遵循自定義配置)
  • retryProducer2 發(fā)送消息后,retryReceiver2 消費消息,報錯且重試 4 次(遵循默認配置)

完美實現(xiàn)自定義重試次數(shù)的需求??!文章來源地址http://www.zghlxwxcb.cn/news/detail-631551.html

到了這里,關于【中間件】RabbitMQ 自定義重試次數(shù)(針對同一模塊不同消費者)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 消息中間件RabbitMQ詳解

    消息中間件RabbitMQ詳解

    消息中間件利用高效可靠的消息傳遞機制進行平臺無關的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來進行分布式系統(tǒng)的集成。通過提供消息傳遞和消息排隊模型,它可以在分布式環(huán)境下擴展進程間的通信。 消息中間件適用于需要可靠的數(shù)據(jù)傳送的分布式環(huán)境。采用消息中間件機制的系統(tǒng)中

    2024年02月16日
    瀏覽(104)
  • 中間件RabbitMQ消息隊列介紹

    中間件RabbitMQ消息隊列介紹

    1.1 什么是 MQ MQ ( message queue ),從字面意思上看,本質是個隊列, FIFO 先入先出,只不過隊列中存放的內容是 message 而已,還是一種跨進程的通信機制,用于上下游傳遞消息。在互聯(lián)網(wǎng)架構中, MQ 是一種非常常 見的上下游 邏輯解耦+物理解耦 的消息通信服務。使用了 MQ 之

    2024年02月13日
    瀏覽(118)
  • RabbitMQ 消息中間件 消息隊列

    RabbitMQ 消息中間件 消息隊列

    RabbitMQ 1、RabbitMQ簡介 RabbiMQ是?Erang開發(fā)的,集群?常?便,因為Erlang天?就是??分布式語?,但其本身并 不?持負載均衡。支持高并發(fā),支持可擴展。支持AJAX,持久化,用于在分布式系統(tǒng)中存儲轉發(fā)消息,在易用性、擴展性、高可用性等方面表現(xiàn)不俗。 2、RabbitMQ 特點 可

    2024年02月03日
    瀏覽(93)
  • 【RabbitMQ教程】前言 —— 中間件介紹

    【RabbitMQ教程】前言 —— 中間件介紹

    ?????????????????????????????????????????????????????????????????? ?? 【 R a b b i t M Q 教程】前言——中間件介紹 color{#FF1493}{【RabbitMQ教程】前言 —— 中間件介紹} 【 R abbi tMQ 教程】前言 —— 中間件介紹 ?? ????????? ?? 仰望天空,妳

    2024年02月08日
    瀏覽(19)
  • 高性能消息中間件 RabbitMQ

    高性能消息中間件 RabbitMQ

    消息隊列 MQ全稱Message Queue(消息隊列),是在消息的傳輸過程中保存消息的容器。多用于系統(tǒng)之間的 異步通信 。 同步通信相當于兩個人當面對話,你一言我一語。必須及時回復: 異步通信相當于通過第三方轉述對話,可能有消息的延遲,但不需要二人時刻保持聯(lián)系。 消息

    2024年02月11日
    瀏覽(32)
  • Springboot整合RabbitMQ消息中間件

    spring-boot-rabbitmq–消息中間件整合 前言:RabbitMQ的各種交換機說明 1、直連交換機 生產者發(fā)布消息時必須帶著routing-key,隊列綁定到交換機時必須指定binding-key ,且routing-key和binding-key必須完全相同,如此才能將消息路由到隊列中 直連交換機通常用來循環(huán)分發(fā)任務給多個workers,

    2024年02月11日
    瀏覽(33)
  • 消息隊列中間件(二)- RabbitMQ(一)

    消息隊列中間件(二)- RabbitMQ(一)

    接收,存儲,轉發(fā)消息 生產者 交換機 隊列 消費者 簡單模式 工作模式 發(fā)布 路由模式 主題模式 發(fā)布訂閱模式 Broker 接收和分發(fā)消息的應用 Virtual host 虛擬分組 Connection: TCP連接 Channel: 節(jié)省連接,每次訪問建立一次Connection消耗太大,所以使用信道代替連接 交換機 隊列 www.r

    2024年02月11日
    瀏覽(94)
  • 中間件_RabbitMQ五種消息模型

    中間件_RabbitMQ五種消息模型

    RabbitMQ官方文檔 RabbitMQ 提供了5種常用消息模型。但是其實3、4、5這三種都屬于訂閱模型,只不過進行路由的方式不同。 簡單消息隊列官方文檔 1、創(chuàng)建簡單消息隊列 2、導入依賴 3、編寫生產者測試類SpringAmqpTest,并利用 RabbitTemplate 實現(xiàn)消息發(fā)送 4、編寫消費者,監(jiān)聽隊列消息

    2024年02月06日
    瀏覽(24)
  • RabbitMQ系列教程消息中間件技術精講

    作者:禪與計算機程序設計藝術 消息中間件(Message Queue,MQ)是一種分布式應用間通信的組件。它可以在不同的系統(tǒng)之間傳遞消息、數(shù)據(jù)或指令。在現(xiàn)代IT架構中,越來越多的應用需要相互通信,所以出現(xiàn)了消息隊列的概念。RabbitMQ是一個開源的AMQP實現(xiàn),是一個可靠、可擴展

    2024年02月06日
    瀏覽(38)
  • 【消息中間件】1小時快速上手RabbitMQ

    【消息中間件】1小時快速上手RabbitMQ

    前 言 ?? 作者簡介:半舊518,長跑型選手,立志堅持寫10年博客,專注于java后端 ?專欄簡介:深入、全面、系統(tǒng)的介紹消息中間件 ?? 文章簡介:本文將介紹RabbitMQ,一小時快速上手RabbitMQ 下面是MQ的優(yōu)缺點 1.2.1 優(yōu)點1:應用解耦 考慮由訂單系統(tǒng)與庫存系統(tǒng)、支付系統(tǒng)、物流

    2024年02月02日
    瀏覽(44)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包