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

springboot整合rabbitmq發(fā)布確認(rèn)高級(jí)

這篇具有很好參考價(jià)值的文章主要介紹了springboot整合rabbitmq發(fā)布確認(rèn)高級(jí)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

在生產(chǎn)環(huán)境中由于一些不明原因,導(dǎo)致 rabbitmq 重啟,在 RabbitMQ 重啟期間生產(chǎn)者消息投遞失敗,導(dǎo)致消息丟失,需要手動(dòng)處理和恢復(fù)。于是,我們?nèi)绾尾拍苓M(jìn)行 RabbitMQ 的消息可靠投遞。

發(fā)布確認(rèn) ?

發(fā)布確認(rèn)方案

springboot整合rabbitmq發(fā)布確認(rèn)高級(jí),rabbitmq,java-rabbitmq,spring boot,rabbitmq

?架構(gòu)

springboot整合rabbitmq發(fā)布確認(rèn)高級(jí),rabbitmq,java-rabbitmq,spring boot,rabbitmq?

配置文件?

在配置文件當(dāng)中添加?spring.rabbitmq.publisher-confirm-type=correlated

? NONE:禁用發(fā)布確認(rèn)模式,是默認(rèn)值
? CORREL:ATED發(fā)布消息成功到交換器后會(huì)觸發(fā)回調(diào)方法
spring.rabbitmq.host=43.139.59.23
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123
spring.rabbitmq.publisher-confirm-type=correlated

配置類(lèi)

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConfirmConfig {
   public static final String CONFIRM_EXCHANGE_NAME = "confirm.exchange";
   public static final String CONFIRM_QUEUE_NAME = "confirm.queue";
   //聲明業(yè)務(wù) Exchange
   @Bean("confirmExchange")
   public DirectExchange confirmExchange(){
   return new DirectExchange(CONFIRM_EXCHANGE_NAME);
   }
   // 聲明確認(rèn)隊(duì)列
   @Bean("confirmQueue")
   public Queue confirmQueue(){
   return QueueBuilder.durable(CONFIRM_QUEUE_NAME).build();
   }
   // 聲明確認(rèn)隊(duì)列綁定關(guān)系
   @Bean
   public Binding queueBinding(@Qualifier("confirmQueue") Queue queue, @Qualifier("confirmExchange") DirectExchange exchange){
    return BindingBuilder.bind(queue).to(exchange).with("key1");
   }
}

?生產(chǎn)者

import com.example.demo.component.MyCallBack;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

@RestController
@RequestMapping("/confirm")
@Slf4j
public class Producer {
     public static final String CONFIRM_EXCHANGE_NAME = "confirm.exchange";
     @Resource
     private RabbitTemplate rabbitTemplate;
     @Resource
     private MyCallBack myCallBack;
     //依賴(lài)注入 rabbitTemplate 之后再設(shè)置它的回調(diào)對(duì)象
     @PostConstruct
     public void init(){
     rabbitTemplate.setConfirmCallback(myCallBack);
     }
     @GetMapping("sendMessage/{message}")
     public void sendMessage(@PathVariable String message){
        //指定消息 id 為 1
        CorrelationData correlationData1=new CorrelationData("1");
        String routingKey="key1";
        
       rabbitTemplate.convertAndSend(CONFIRM_EXCHANGE_NAME,routingKey,message+routingKey,correlationData1);
        CorrelationData correlationData2=new CorrelationData("2");
        routingKey="key2";
        
       rabbitTemplate.convertAndSend(CONFIRM_EXCHANGE_NAME,routingKey,message+routingKey,correlationData2);
        log.info("發(fā)送消息內(nèi)容:{}",message);
     }
}

?回調(diào)接口

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class MyCallBack implements RabbitTemplate.ConfirmCallback {
   /**
   * 交換機(jī)不管是否收到消息的一個(gè)回調(diào)方法
   * CorrelationData
   * 消息相關(guān)數(shù)據(jù)
   * ack
   * 交換機(jī)是否收到消息
   */
   @Override
   public void confirm(CorrelationData correlationData, boolean ack, String cause) {
      String id=correlationData!=null?correlationData.getId():"";
      if(ack){
        log.info("交換機(jī)已經(jīng)收到 id 為:{}的消息",id);
      }else{
       log.info("交換機(jī)還未收到 id 為:{}消息,由于原因:{}",id,cause);
      }
   }
}

?消費(fèi)者

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class ConfirmConsumer {
   public static final String CONFIRM_QUEUE_NAME = "confirm.queue";
   @RabbitListener(queues =CONFIRM_QUEUE_NAME)
   public void receiveMsg(Message message){
     String msg=new String(message.getBody());
     log.info("接受到隊(duì)列 confirm.queue 消息:{}",msg);
   }
}

?結(jié)果

springboot整合rabbitmq發(fā)布確認(rèn)高級(jí),rabbitmq,java-rabbitmq,spring boot,rabbitmq

可以看到,發(fā)送了兩條消息,第一條消息的 RoutingKey "key1" ,第二條消息的 RoutingKey
"key2" ,兩條消息都成功被交換機(jī)接收,也收到了交換機(jī)的確認(rèn)回調(diào),但消費(fèi)者只收到了一條消息,因?yàn)榈诙l消息的 RoutingKey 與隊(duì)列的 BindingKey 不一致,也沒(méi)有其它隊(duì)列能接收這個(gè)消息,所以第二條消息被直接丟棄了。

?回退消息

Mandatory 參數(shù)?

在僅開(kāi)啟了生產(chǎn)者確認(rèn)機(jī)制的情況下,交換機(jī)接收到消息后,會(huì)直接給消息生產(chǎn)者發(fā)送確認(rèn)消息 , 果發(fā)現(xiàn)該消息不可路由,那么消息會(huì)被直接丟棄,此時(shí)生產(chǎn)者是不知道消息被丟棄這個(gè)事件的 。那么如何讓無(wú)法被路由的消息幫我想辦法處理一下?最起碼通知我一聲,我好自己處理啊。通過(guò)設(shè)置 mandatory 參 數(shù)可以在當(dāng)消息傳遞過(guò)程中不可達(dá)目的地時(shí)將消息返回給生產(chǎn)者。

?生產(chǎn)者

import com.example.demo.component.MyCallBack;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.UUID;

@RestController
@RequestMapping("/confirm")
@Slf4j
public class Producer {
     public static final String CONFIRM_EXCHANGE_NAME = "confirm.exchange";
     @Resource
     private RabbitTemplate rabbitTemplate;
     @Resource
     private MyCallBack myCallBack;
     //依賴(lài)注入 rabbitTemplate 之后再設(shè)置它的回調(diào)對(duì)象
     @PostConstruct
     public void init(){
         rabbitTemplate.setConfirmCallback(myCallBack);
         /**
          * true:
          * 交換機(jī)無(wú)法將消息進(jìn)行路由時(shí),會(huì)將該消息返回給生產(chǎn)者
          * false:
          * 如果發(fā)現(xiàn)消息無(wú)法進(jìn)行路由,則直接丟棄
          */
         rabbitTemplate.setMandatory(true);
         //設(shè)置回退消息交給誰(shuí)處理
         rabbitTemplate.setReturnCallback(myCallBack);

     }
    

    @GetMapping("sendMessage")
    public void sendMessage(String message){
        //讓消息綁定一個(gè) id 值
        CorrelationData correlationData1 = new CorrelationData(UUID.randomUUID().toString());

        rabbitTemplate.convertAndSend(CONFIRM_EXCHANGE_NAME,"key1",message+"key1",correlationData1)
        ;
        log.info("發(fā)送消息 id 為:{}內(nèi)容為{}",correlationData1.getId(),message+"key1");
        CorrelationData correlationData2 = new CorrelationData(UUID.randomUUID().toString());

        rabbitTemplate.convertAndSend(CONFIRM_EXCHANGE_NAME,"key2",message+"key2",correlationData2)
        ;
        log.info("發(fā)送消息 id 為:{}內(nèi)容為{}",correlationData2.getId(),message+"key2");
    }
}

?回調(diào)接口

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class MyCallBack implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnCallback {
    /**
     * 交換機(jī)不管是否收到消息的一個(gè)回調(diào)方法
     * CorrelationData
     * 消息相關(guān)數(shù)據(jù)
     * ack
     * 交換機(jī)是否收到消息
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        String id=correlationData!=null?correlationData.getId():"";
        if(ack){
            log.info("交換機(jī)已經(jīng)收到 id 為:{}的消息",id);
        }else{
            log.info("交換機(jī)還未收到 id 為:{}消息,由于原因:{}",id,cause);
        }
    }
    //當(dāng)消息無(wú)法路由的時(shí)候的回調(diào)方法
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String
    exchange, String routingKey) {
        log.error(" 消 息 {}, 被交換機(jī) {} 退回,退回原因 :{}, 路 由 key:{}",new
        String(message.getBody()),exchange,replyText,routingKey);
    }
}

?結(jié)果

springboot整合rabbitmq發(fā)布確認(rèn)高級(jí),rabbitmq,java-rabbitmq,spring boot,rabbitmq?接收到被退回的消息

備份交換機(jī)?

有了 mandatory 參數(shù)和回退消息,我們獲得了對(duì)無(wú)法投遞消息的感知能力,有機(jī)會(huì)在生產(chǎn)者的消息無(wú)法被投遞時(shí)發(fā)現(xiàn)并處理。但有時(shí)候,我們并不知道該如何處理這些無(wú)法路由的消息,最多打個(gè)日志,然后觸發(fā)報(bào)警,再來(lái)手動(dòng)處理。而通過(guò)日志來(lái)處理這些無(wú)法路由的消息是很不優(yōu)雅的做法,特別是當(dāng)生產(chǎn)者所在的服務(wù)有多臺(tái)機(jī)器的時(shí)候,手動(dòng)復(fù)制日志會(huì)更加麻煩而且容易出錯(cuò)。而且設(shè)置 mandatory 參數(shù)會(huì)增加生產(chǎn)者的復(fù)雜性,需要添加處理這些被退回的消息的邏輯。如果既不想丟失消息,又不想增加生產(chǎn)者的復(fù)雜性,該怎么做呢?前面在設(shè)置死信隊(duì)列的文章中,我們提到,可以為隊(duì)列設(shè)置死信交換機(jī)來(lái)存儲(chǔ)那些處理失敗的消息,可是這些不可路由消息根本沒(méi)有機(jī)會(huì)進(jìn)入到隊(duì)列,因此無(wú)法使用死信隊(duì)列來(lái)保存消息。在 RabbitMQ 中,有一種備份交換機(jī)的機(jī)制存在,可以很好的應(yīng)對(duì)這個(gè)問(wèn)題。什么是備份交換機(jī)呢?備份交換機(jī)可以理解為 RabbitMQ 中交換機(jī)的“備胎”,當(dāng)我們?yōu)槟骋粋€(gè)交換機(jī)聲明一個(gè)對(duì)應(yīng)的備份交換機(jī)時(shí),就是為它創(chuàng)建一個(gè)備胎,當(dāng)交換機(jī)接收到一條不可路由消息時(shí),將會(huì)把這條消息轉(zhuǎn)發(fā)到備份交換機(jī)中,由備份交換機(jī)來(lái)進(jìn)行轉(zhuǎn)發(fā)和處理,通常備份交換機(jī)的類(lèi)型為 Fanout ,這樣就能把所有消息都投遞到與其綁定的隊(duì)列中,然后我們?cè)趥浞萁粨Q機(jī)下綁定一個(gè)隊(duì)列,這樣所有那些原交換機(jī)無(wú)法被路由的消息,就會(huì)都進(jìn)入這個(gè)隊(duì)列了。

架構(gòu)

springboot整合rabbitmq發(fā)布確認(rèn)高級(jí),rabbitmq,java-rabbitmq,spring boot,rabbitmq

?配置類(lèi)

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConfirmConfig {
     public static final String CONFIRM_EXCHANGE_NAME = "confirm.exchange";
     public static final String CONFIRM_QUEUE_NAME = "confirm.queue";
     public static final String BACKUP_EXCHANGE_NAME = "backup.exchange";
     public static final String BACKUP_QUEUE_NAME = "backup.queue";
     public static final String WARNING_QUEUE_NAME = "warning.queue";
     // 聲明確認(rèn)隊(duì)列
     @Bean("confirmQueue")
     public Queue confirmQueue(){
       return QueueBuilder.durable(CONFIRM_QUEUE_NAME).build();
     }
     //聲明確認(rèn)隊(duì)列綁定關(guān)系
     @Bean
     public Binding queueBinding(@Qualifier("confirmQueue") Queue queue, @Qualifier("confirmExchange") DirectExchange exchange){
       return BindingBuilder.bind(queue).to(exchange).with("key1");
     }
     //聲明備份 Exchange
     @Bean("backupExchange")
     public FanoutExchange backupExchange(){
       return new FanoutExchange(BACKUP_EXCHANGE_NAME);
     }
     //聲明確認(rèn) Exchange 交換機(jī)的備份交換機(jī)
     @Bean("confirmExchange")
     public DirectExchange confirmExchange(){
       ExchangeBuilder exchangeBuilder =
       ExchangeBuilder.directExchange(CONFIRM_EXCHANGE_NAME)
       .durable(true)
       //設(shè)置該交換機(jī)的備份交換機(jī)
       .withArgument("alternate-exchange", BACKUP_EXCHANGE_NAME);
       return (DirectExchange)exchangeBuilder.build();
     }
     // 聲明警告隊(duì)列
     @Bean("warningQueue")
     public Queue warningQueue(){
        return QueueBuilder.durable(WARNING_QUEUE_NAME).build();
     }
     // 聲明報(bào)警隊(duì)列綁定關(guān)系
     @Bean
     public Binding warningBinding(@Qualifier("warningQueue") Queue queue,
     @Qualifier("backupExchange") FanoutExchange backupExchange){
       return BindingBuilder.bind(queue).to(backupExchange);
     }
     // 聲明備份隊(duì)列
     @Bean("backQueue")
     public Queue backQueue(){
       return QueueBuilder.durable(BACKUP_QUEUE_NAME).build();
     }
     // 聲明備份隊(duì)列綁定關(guān)系
     @Bean
     public Binding backupBinding(@Qualifier("backQueue") Queue queue, @Qualifier("backupExchange") FanoutExchange backupExchange){
       return BindingBuilder.bind(queue).to(backupExchange);
     }
}

?報(bào)警消費(fèi)者

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class ConfirmConsumer {
   public static final String CONFIRM_QUEUE_NAME = "confirm.queue";
   @RabbitListener(queues =CONFIRM_QUEUE_NAME)
   public void receiveMsg(Message message){
     String msg=new String(message.getBody());
     log.info("接受到隊(duì)列 confirm.queue 消息:{}",msg);
   }
}

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-670579.html

結(jié)果?

springboot整合rabbitmq發(fā)布確認(rèn)高級(jí),rabbitmq,java-rabbitmq,spring boot,rabbitmq

mandatory 參數(shù)與備份交換機(jī)可以一起使用的時(shí)候,如果兩者同時(shí)開(kāi)啟,消息究竟何去何從?誰(shuí)優(yōu)先級(jí)高,經(jīng)過(guò)上面結(jié)果顯示答案是備份交換機(jī)優(yōu)先級(jí)高 。

?

到了這里,關(guān)于springboot整合rabbitmq發(fā)布確認(rèn)高級(jí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 8. springboot + rabbitmq 消息發(fā)布確認(rèn)機(jī)制

    8. springboot + rabbitmq 消息發(fā)布確認(rèn)機(jī)制

    在 RabbitMQ之生產(chǎn)者發(fā)布確認(rèn)原理章節(jié)已經(jīng)介紹了rabbitmq生產(chǎn)者是如何對(duì)消息進(jìn)行發(fā)布確認(rèn)保證消息不丟失的。本章節(jié)繼續(xù)看下springboot整合rabbitmq后是如何保證消息不丟失的。 消息正常是通過(guò)生產(chǎn)者生產(chǎn)消息傳遞到交換機(jī),然后經(jīng)過(guò)交換機(jī)路由到消息隊(duì)列中,最后消費(fèi)者消費(fèi),

    2023年04月25日
    瀏覽(20)
  • 消息隊(duì)列-RabbitMQ:發(fā)布確認(rèn)—發(fā)布確認(rèn)邏輯和發(fā)布確認(rèn)的策略

    消息隊(duì)列-RabbitMQ:發(fā)布確認(rèn)—發(fā)布確認(rèn)邏輯和發(fā)布確認(rèn)的策略

    生產(chǎn)者將信道設(shè)置成 confirm 模式,一旦信道進(jìn)入 confirm 模式,所有在該信道上面發(fā)布的消息都將會(huì)被指派一個(gè)唯一的 ID (從 1 開(kāi)始),一旦消息被投遞到所有匹配的隊(duì)列之后,broker 就會(huì)發(fā)送一個(gè)確認(rèn)給生產(chǎn)者 (包含消息的唯一 ID),這就使得生產(chǎn)者知道消息已經(jīng)正確到達(dá)目的隊(duì)列

    2024年02月21日
    瀏覽(27)
  • RabbitMQ(一) - 基本結(jié)構(gòu)、SpringBoot整合RabbitMQ、工作隊(duì)列、發(fā)布訂閱、直接、主題交換機(jī)模式

    RabbitMQ(一) - 基本結(jié)構(gòu)、SpringBoot整合RabbitMQ、工作隊(duì)列、發(fā)布訂閱、直接、主題交換機(jī)模式

    Publisher : 生產(chǎn)者 Queue: 存儲(chǔ)消息的容器隊(duì)列; Consumer:消費(fèi)者 Connection:消費(fèi)者與消息服務(wù)的TCP連接 Channel:信道,是TCP里面的虛擬連接。例如:電纜相當(dāng)于TCP,信道是一條獨(dú)立光纖束,一條TCP連接上創(chuàng)建多少條信道是沒(méi)有限制的。TCP一旦打開(kāi),就會(huì)出AMQP信道。無(wú)論是發(fā)布消息

    2024年02月14日
    瀏覽(23)
  • RabbitMQ(二) - RabbitMQ與消息發(fā)布確認(rèn)與返回、消費(fèi)確認(rèn)

    SpringBoot與RabbitMQ整合后,對(duì)RabbitClient的“確認(rèn)”進(jìn)行了封裝、使用方式與RabbitMQ官網(wǎng)不一致; 生產(chǎn)者給交換機(jī)發(fā)送消息后、若是不管了,則會(huì)出現(xiàn)消息丟失; 解決方案1: 交換機(jī)接受到消息、給生產(chǎn)者一個(gè)答復(fù)ack, 若生產(chǎn)者沒(méi)有收到ack, 可能出現(xiàn)消息丟失,因此重新發(fā)送消息;

    2024年02月14日
    瀏覽(21)
  • RabbitMQ 發(fā)布確認(rèn)機(jī)制

    RabbitMQ 發(fā)布確認(rèn)機(jī)制

    發(fā)布確認(rèn)模式是避免消息由生產(chǎn)者到RabbitMQ消息丟失的一種手段 ??生產(chǎn)者通過(guò)調(diào)用channel.confirmSelect方法將信道設(shè)置為confirm模式,之后RabbitMQ會(huì)返回Confirm.Select-OK命令表示同意生產(chǎn)者將當(dāng)前信道設(shè)置為confirm模式。 ??confirm模式下的信道所發(fā)送的消息都將被應(yīng)帶ack或者nack一次

    2024年02月13日
    瀏覽(21)
  • rabbitmq的發(fā)布確認(rèn)

    rabbitmq的發(fā)布確認(rèn)

    生產(chǎn)者將信道設(shè)置成 confirm 模式,一旦信道進(jìn)入 confirm 模式, 所有在該信道上面發(fā)布的 消息都將會(huì)被指派一個(gè)唯一的 ID (從 1 開(kāi)始),一旦消息被投遞到所有匹配的隊(duì)列之后,broker 就會(huì)發(fā)送一個(gè)確認(rèn)給生產(chǎn)者(包含消息的唯一 ID),這就使得生產(chǎn)者知道消息已經(jīng)正確到達(dá)目的隊(duì)

    2024年02月12日
    瀏覽(17)
  • 【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)

    【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)

    ?????????????????????????????????????????????????????????????????? ?? 【 R a b b i t M Q 教程】第三章—— R a b b i t M Q ? 發(fā)布確認(rèn) color{#FF1493}{【RabbitMQ教程】第三章 —— RabbitMQ - 發(fā)布確認(rèn)} 【 R abbi tMQ 教程】第三章 —— R abbi tMQ ? 發(fā)布確認(rèn)

    2024年02月08日
    瀏覽(28)
  • RabbitMQ系列(10)--RabbitMQ發(fā)布確認(rèn)模式的概念及實(shí)現(xiàn)

    RabbitMQ系列(10)--RabbitMQ發(fā)布確認(rèn)模式的概念及實(shí)現(xiàn)

    概念:雖然我們可以設(shè)置隊(duì)列和隊(duì)列中的消息持久化,但任然存在消息在持久化的過(guò)程中,即在寫(xiě)入磁盤(pán)的過(guò)程中,消息未完全寫(xiě)入,然后服務(wù)器宕機(jī)導(dǎo)致消息丟失的情況,發(fā)布確認(rèn)就是為了解決這種情況的概念,在消息完全寫(xiě)入磁盤(pán)后才確認(rèn)消息完全持久化了 1、發(fā)布確認(rèn)

    2024年02月13日
    瀏覽(24)
  • Java操作RabbitMq并整合SpringBoot

    秋風(fēng)閣-北溪入江流 RabbitMq自帶有專(zhuān)門(mén)的管理界面,可以在其管理界面對(duì)RabbitMq進(jìn)行管理查看等操作。 RabbitMq的管理界面的對(duì)外端口為 15672 ,當(dāng)我們啟動(dòng)RabbitMq后,需要啟動(dòng)管理界面插件后才能訪問(wèn)界面。 通過(guò)參數(shù)配置連接RabbitMq 通過(guò)amqp協(xié)議連接RabbitMq queueDeclarePassive: 創(chuàng)建或

    2024年02月16日
    瀏覽(26)
  • RabbitMQ學(xué)習(xí)——發(fā)布訂閱/fanout模式 & topic模式 & rabbitmq回調(diào)確認(rèn) & 延遲隊(duì)列(死信)設(shè)計(jì)

    RabbitMQ學(xué)習(xí)——發(fā)布訂閱/fanout模式 & topic模式 & rabbitmq回調(diào)確認(rèn) & 延遲隊(duì)列(死信)設(shè)計(jì)

    1.rabbitmq隊(duì)列方式的梳理,點(diǎn)對(duì)點(diǎn),一對(duì)多; 2.發(fā)布訂閱模式,交換機(jī)到消費(fèi)者,以郵箱和手機(jī)驗(yàn)證碼為例; 3.topic模式,根據(jù)規(guī)則決定發(fā)送給哪個(gè)隊(duì)列; 4.rabbitmq回調(diào)確認(rèn),setConfirmCallback和setReturnsCallback; 5.死信隊(duì)列,延遲隊(duì)列,創(chuàng)建方法,正?!佬?,設(shè)置延遲時(shí)間; 點(diǎn)對(duì)

    2024年02月13日
    瀏覽(92)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包