SpringBoot가 RabbitMQ를 통합하여 지연 대기열을 구현하는 방법
메시지가 손실되지 않도록 하는 방법
rabbitmq 메시지 전달 경로
Producer->Switch->Queue->Consumer
일반적으로 3단계로 나누어집니다.
1. 생산자는 메시지 전달의 신뢰성을 보장합니다.
2.mq 내부 메시지는 손실되지 않습니다.
3. 소비자 소비가 성공합니다.
메시지 전달 신뢰성이란 무엇입니까
간단히 말하면 메시지는 100% 메시지 대기열로 전송됩니다.
confirmCallback을 켤 수 있습니다
생산자가 메시지를 전달한 후 mq는 ack를 기반으로 메시지가 mq로 전송되었는지 확인할 수 있습니다.
confirmCallback을 켜세요
수정하세요. 구성 파일
#NONE:禁用发布确认模式,是默认值,CORRELATED:发布消息成功到交换器后会触发回调方法 spring: rabbitmq: publisher-confirm-type: correlated
테스트 코드
@Test public void testConfirmCallback() throws InterruptedException { rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() { /** * * @param correlationData 配置 * @param ack 交换机是否收到消息,true是成功,false是失败 * @param cause 失败的原因 */ @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { System.out.println("confirm=====>"); System.out.println("confirm==== ack="+ack); System.out.println("confirm==== cause="+cause); //根据ACK状态做对应的消息更新操作 TODO } }); rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"ikun.mei", "鸡你太美"); Thread.sleep(10000); }
는 returnCallback을 통해 Exchange에서 대기열로 메시지가 성공적으로 전송되었는지 확인합니다. 구성 파일 수정
spring: rabbitmq: #开启returnCallback publisher-returns: true #交换机处理消息到路由失败,则会返回给生产者 template: mandatory: true
테스트 코드
@Test void testReturnCallback() { //为true,则交换机处理消息到路由失败,则会返回给生产者 配置文件指定,则这里不需指定 rabbitTemplate.setMandatory(true); //开启强制消息投递(mandatory为设置为true),但消息未被路由至任何一个queue,则回退一条消息 rabbitTemplate.setReturnsCallback(returned -> { int code = returned.getReplyCode(); System.out.println("code="+code); System.out.println("returned="+ returned); }); rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME,"123456","测试returnCallback"); }
소비자가 메시지를 소비할 때 ack를 통해 메시지가 소비되었는지 수동으로 확인해야 합니다.
구성 파일 수정
spring: rabbitmq: listener: simple: acknowledge-mode: manual
테스트 코드 작성
@RabbitHandler public void consumer(String body, Message message, Channel channel) throws IOException { long msgTag = message.getMessageProperties().getDeliveryTag(); System.out.println("msgTag="+msgTag); System.out.println("message="+ message); System.out.println("body="+body); //成功确认,使用此回执方法后,消息会被 rabbitmq broker 删除 channel.basicAck(msgTag,false); // channel.basicNack(msgTag,false,true); }
deliveryTags는 메시지 전달 순서 번호입니다. 메시지가 소비되거나 메시지가 다시 전달될 때마다 DeliveryTag가 증가합니다
ttl 배달 못한 편지 대기열
데드 레터 큐란 무엇인가요?
has not been 적시에 소비된 메시지가 저장되는 큐
어떤 상황에서 메시지가 데드 레터가 되나요
소비자가 메시지를 거부합니다 (basic.reject/ basic. nack) 대기열에 다시 넣지 않습니다. requeue=false
메시지가 대기열에서 소비되지 않았고 대기열 또는 메시지 자체의 만료 시간을 초과했습니다TTL(Time-To-Live)
큐의 메시지 길이가 한계에 도달했습니다
결과: 메시지가 데드 레터가 됩니다. 마지막으로 큐가 데드 레터 스위치에 바인딩된 경우 메시지는 데드 레터 큐로 다시 라우팅됩니다. by the Dead Letter Switch
데드 레터 큐는 지연된 큐 소비를 위해 자주 사용됩니다.
지연 대기열
생산자는 이 메시지가 mq에 전달될 때 즉시 소비될 것으로 기대하지 않지만 소비하기 전에 일정 시간 동안 기다립니다.
springboot는 시간 초과 시 주문 자동 종료를 실현하기 위해 Rabbitmq를 통합합니다.
package com.fandf.test.rabbit; import org.springframework.amqp.core.*; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; /** * @author fandongfeng * @date 2023/4/15 15:38 */ @Configuration public class RabbitMQConfig { /** * 订单交换机 */ public static final String ORDER_EXCHANGE = "order_exchange"; /** * 订单队列 */ public static final String ORDER_QUEUE = "order_queue"; /** * 订单路由key */ public static final String ORDER_QUEUE_ROUTING_KEY = "order.#"; /** * 死信交换机 */ public static final String ORDER_DEAD_LETTER_EXCHANGE = "order_dead_letter_exchange"; /** * 死信队列 routingKey */ public static final String ORDER_DEAD_LETTER_QUEUE_ROUTING_KEY = "order_dead_letter_queue_routing_key"; /** * 死信队列 */ public static final String ORDER_DEAD_LETTER_QUEUE = "order_dead_letter_queue"; /** * 创建死信交换机 */ @Bean("orderDeadLetterExchange") public Exchange orderDeadLetterExchange() { return new TopicExchange(ORDER_DEAD_LETTER_EXCHANGE, true, false); } /** * 创建死信队列 */ @Bean("orderDeadLetterQueue") public Queue orderDeadLetterQueue() { return QueueBuilder.durable(ORDER_DEAD_LETTER_QUEUE).build(); } /** * 绑定死信交换机和死信队列 */ @Bean("orderDeadLetterBinding") public Binding orderDeadLetterBinding(@Qualifier("orderDeadLetterQueue") Queue queue, @Qualifier("orderDeadLetterExchange")Exchange exchange) { return BindingBuilder.bind(queue).to(exchange).with(ORDER_DEAD_LETTER_QUEUE_ROUTING_KEY).noargs(); } /** * 创建订单交换机 */ @Bean("orderExchange") public Exchange orderExchange() { return new TopicExchange(ORDER_EXCHANGE, true, false); } /** * 创建订单队列 */ @Bean("orderQueue") public Queue orderQueue() { Map<String, Object> args = new HashMap<>(3); //消息过期后,进入到死信交换机 args.put("x-dead-letter-exchange", ORDER_DEAD_LETTER_EXCHANGE); //消息过期后,进入到死信交换机的路由key args.put("x-dead-letter-routing-key", ORDER_DEAD_LETTER_QUEUE_ROUTING_KEY); //过期时间,单位毫秒 args.put("x-message-ttl", 10000); return QueueBuilder.durable(ORDER_QUEUE).withArguments(args).build(); } /** * 绑定订单交换机和队列 */ @Bean("orderBinding") public Binding orderBinding(@Qualifier("orderQueue") Queue queue, @Qualifier("orderExchange")Exchange exchange) { return BindingBuilder.bind(queue).to(exchange).with(ORDER_QUEUE_ROUTING_KEY).noargs(); } }
Consumer
package com.fandf.test.rabbit; import cn.hutool.core.date.DateUtil; import com.rabbitmq.client.Channel; import org.springframework.amqp.core.Message; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; import java.io.IOException; /** * @author fandongfeng * @date 2023/4/15 15:42 */ @Component @RabbitListener(queues = RabbitMQConfig.ORDER_DEAD_LETTER_QUEUE) public class OrderMQListener { @RabbitHandler public void consumer(String body, Message message, Channel channel) throws IOException { System.out.println("收到消息:" + DateUtil.now()); long msgTag = message.getMessageProperties().getDeliveryTag(); System.out.println("msgTag=" + msgTag); System.out.println("message=" + message); System.out.println("body=" + body); channel.basicAck(msgTag, false); } }
테스트 클래스
@Test void testOrder() throws InterruptedException { //为true,则交换机处理消息到路由失败,则会返回给生产者 配置文件指定,则这里不需指定 rabbitTemplate.setMandatory(true); //开启强制消息投递(mandatory为设置为true),但消息未被路由至任何一个queue,则回退一条消息 rabbitTemplate.setReturnsCallback(returned -> { int code = returned.getReplyCode(); System.out.println("code=" + code); System.out.println("returned=" + returned); }); rabbitTemplate.convertAndSend(RabbitMQConfig.ORDER_EXCHANGE, "order", "测试订单延迟"); System.out.println("发送消息:" + DateUtil.now()); Thread.sleep(20000); }
프로그램 출력
메시지 보내기: 2023-04-16 15:14:34
메시지 받기: 2023-04 - 16 15:14:44
msgTag=1
message=(본문:'테스트 주문 지연' MessageProperties [headers={spring_listener_return_correlation=03169cfc-5061-41fe-be47-c98e36d17eac, x-first-death-exchange=order_exchange, x - 사망=[{이유=만료, 횟수=1, 교환=주문_교환, 시간=월 4월 16일 15:14:44 CST 2023, 라우팅-키=[주문], 대기열=주문_큐}], x-first-death- 이유 = 만료됨, x-first-death-queue=order_queue}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, 우선순위=0, redelived=false, receivedExchange=order_dead_letter_exchange, receivedRoutingKey=order_dead_letter_queue_routing_key , DeliveryTag=1, ConsumerTag=amq.ctag-Eh8GMgrsrAH1rvtGj7ykOQ, ConsumerQueue=order_dead_letter_queue])
body=테스트 주문 지연
위 내용은 SpringBoot가 RabbitMQ를 통합하여 지연 대기열을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











React 및 RabbitMQ를 사용하여 안정적인 메시징 애플리케이션을 구축하는 방법 소개: 최신 애플리케이션은 실시간 업데이트 및 데이터 동기화와 같은 기능을 달성하기 위해 안정적인 메시징을 지원해야 합니다. React는 사용자 인터페이스 구축을 위한 인기 있는 JavaScript 라이브러리인 반면 RabbitMQ는 안정적인 메시징 미들웨어입니다. 이 기사에서는 React와 RabbitMQ를 결합하여 안정적인 메시징 애플리케이션을 구축하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. RabbitMQ 개요:

RabbitMQ를 사용하여 PHP에서 분산 메시지 처리를 구현하는 방법 소개: 대규모 애플리케이션 개발에서 분산 시스템은 일반적인 요구 사항이 되었습니다. 분산 메시지 처리는 작업을 여러 처리 노드에 분산하여 시스템의 효율성과 안정성을 향상시키는 패턴입니다. RabbitMQ는 AMQP 프로토콜을 사용하여 메시지 전달 및 처리를 구현하는 신뢰할 수 있는 오픈 소스 메시지 대기열 시스템입니다. 이 기사에서는 배포를 위해 PHP에서 RabbitMQ를 사용하는 방법을 다룹니다.

SpringBoot와 SpringMVC는 모두 Java 개발에서 일반적으로 사용되는 프레임워크이지만 둘 사이에는 몇 가지 분명한 차이점이 있습니다. 이 기사에서는 이 두 프레임워크의 기능과 용도를 살펴보고 차이점을 비교할 것입니다. 먼저 SpringBoot에 대해 알아봅시다. SpringBoot는 Spring 프레임워크를 기반으로 하는 애플리케이션의 생성 및 배포를 단순화하기 위해 Pivotal 팀에서 개발되었습니다. 독립 실행형 실행 파일을 구축하는 빠르고 가벼운 방법을 제공합니다.

최신 애플리케이션의 복잡성이 증가함에 따라 메시징은 강력한 도구가 되었습니다. 이 분야에서 RabbitMQ는 다양한 애플리케이션 간에 메시지를 전달하는 데 사용할 수 있는 매우 인기 있는 메시지 브로커가 되었습니다. 이 기사에서는 Go 언어에서 RabbitMQ를 사용하는 방법을 살펴보겠습니다. 이 가이드에서는 다음 내용을 다룹니다. RabbitMQ 소개 RabbitMQ 설치 RabbitMQ 기본 개념 Go에서 RabbitMQ 시작하기 RabbitMQ 및 Go

이 글에서는 dubbo+nacos+Spring Boot의 실제 개발에 대해 이야기하기 위해 자세한 예제를 작성하겠습니다. 이 기사에서는 이론적 지식을 너무 많이 다루지는 않지만 dubbo를 nacos와 통합하여 개발 환경을 신속하게 구축하는 방법을 설명하는 가장 간단한 예를 작성합니다.

Golang과 RabbitMQ 간의 실시간 데이터 동기화 솔루션 소개: 오늘날 인터넷의 대중화와 데이터 양의 폭발적인 증가로 인해 실시간 데이터 동기화가 점점 더 중요해지고 있습니다. 비동기 데이터 전송 및 데이터 동기화 문제를 해결하기 위해 많은 회사에서는 메시지 대기열을 사용하여 데이터의 실시간 동기화를 달성하기 시작했습니다. 이 글에서는 Golang과 RabbitMQ를 기반으로 한 실시간 데이터 동기화 솔루션을 소개하고 구체적인 코드 예시를 제공합니다. 1. RabbitMQ란 무엇인가요? 랍비

이제 점점 더 많은 회사들이 마이크로서비스 아키텍처 모델을 채택하기 시작하고 있으며 이 아키텍처에서 메시지 큐는 중요한 통신 방법이 되었으며 그 중 RabbitMQ가 널리 사용됩니다. Go 언어에서 go-zero는 최근 몇 년 동안 등장한 프레임워크로, 개발자가 메시지 대기열을 보다 쉽게 사용할 수 있도록 다양한 실용적인 도구와 방법을 제공합니다. 아래에서는 실제 응용 프로그램을 기반으로 한 go-zero를 소개합니다. RabbitMQ의 응용실습. 1.RabbitMQ 개요Rabbit

GolangRabbitMQ: 고가용성 메시지 대기열 시스템의 아키텍처 설계 및 구현에는 특정 코드 예제가 필요합니다. 소개: 인터넷 기술의 지속적인 발전과 광범위한 응용으로 인해 메시지 대기열은 현대 소프트웨어 시스템에서 없어서는 안될 부분이 되었습니다. 분리, 비동기 통신, 내결함성 처리 및 기타 기능을 구현하는 도구로서 메시지 큐는 분산 시스템에 대한 고가용성 및 확장성 지원을 제공합니다. 효율적이고 간결한 프로그래밍 언어인 Golang은 높은 동시성 및 고성능 시스템을 구축하는 데 널리 사용됩니다.
