SpringBoot整合RabbitMQ

目录

一、添加依赖 

二、编写配置信息和配置类

三、创建生产者

四、创建消费者

五、消息可靠性投递

1. 确认模式

2. 退回模式

3. ack签收


一、添加依赖 

 在构建springboot项目的时候添加RabbitMQ依赖

二、编写配置信息和配置类

 在application.yml文件配置信息

#配置rabbitmq
spring:
  rabbitmq:
    host: 192...
    port: 5672
    username: yygs
    password: yygs
    virtual-host: /

#日志格式
logging:
  pattern:
    console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}:%msg%n)'

编写配置类,包括交换机,队列,以及将交换机和队列进行绑定

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 RabbitConfig {
    private final String EXCHANGE_NAME = "boot_topic_exchange";
    private final String QUEUE_NAME = "boot_queue";

    //创建交换机
    @Bean("bootExchange")
    public Exchange getExchange() {
        return ExchangeBuilder
                .topicExchange(EXCHANGE_NAME) //交换机类型
                .durable(true)  //是否持久化
                .build();
    }

    //创建队列
    @Bean("bootQueue")
    public Queue getMessageQueue() {
        return QueueBuilder
                .durable(QUEUE_NAME)    //队列持久化
                .ttl(10000) // 队列每条消息存活时间10s
                .build();
    }

    //交换机绑定队列
    @Bean
    public Binding BindMessageQueue(@Qualifier("bootExchange") Exchange exchange, @Qualifier("bootQueue") Queue queue) {
        return BindingBuilder
                .bind(queue)
                .to(exchange)
                .with("#.message.#")
                .noargs();
    }
}

三、创建生产者

package com.yygs.demo;

import org.junit.jupiter.api.Test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

@SpringBootTest
public class TestProducer {
    // 注入RabbitTemplate工具类
    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSendMessage(){
        /*
         * 参数1:交换机名字
         * 参数2:路由键
         * 参数3:消息主体
         */
        rabbitTemplate.convertAndSend("boot_topic_exchange", "message","消息");
    }
    
}

四、创建消费者

消费者同样要编写application.yml来监听队列

然后消费者类:

package com.yygs.demo;

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

@Component
public class Consumer {
    // 监听队列
    @RabbitListener(queues = "boot_queue")
    public void listenMessage(String message) {
        System.out.println("接受消息:" + message);
    }
}

五、消息可靠性投递

有三种模式。

RabbitMQ消息投递的路径为:

生产者 ---> 交换机 ---> 队列 ---> 消费者

RabbitMQ工作的过程中,每个环节消息都可能传递失败,那么 RabbitMQ是如何监听消息是否成功投递的呢?

确认模式(confirm)可以监听消息是否从生产者成功传递到交换机。

退回模式(return)可以监听消息是否从交换机成功传递到队列。

消费者消息确认(Consumer Ack)可以监听消费者是否成功处理消息。

1. 确认模式

application.yml

#配置rabbitmq
spring:
  rabbitmq:
    host: 192...
    port: 5672
    username: yygs
    password: yygs
    virtual-host: /
    #开启确认模式
    publisher-confirm-type: correlated


#日志格式
logging:
  pattern:
    console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}:%msg%n)'

 生产者

@SpringBootTest
public class TestProducer {
    // 注入RabbitTemplate工具类
    @Resource
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testSendMessage(){
        // 定义确认模式的回调放啊发,消息向交换机发送后会会调用confirm方法
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             *被调用的回调方法
             * @param correlationData   相关配置信息
             * @param ack   交换机是否 成功收到了信息
             * @param cause 失败原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                if (ack) {
                    System.out.println("成功接收消息!");
                } else {
                    System.out.println("confirm接受失败,原因是:" + cause);
                    // 做一些处理,让消息再次发送
                }
            }
        });

        /*
         * 参数1:交换机名字
         * 参数2:路由通配符
         * 参数3:消息主体
         */
        rabbitTemplate.convertAndSend("boot_topic_exchange", "message","消息");
    }
}

2. 退回模式

  application.yml配置

#配置rabbitmq
spring:
  rabbitmq:
    host: 192...
    port: 5672
    username: yygs
    password: yygs
    virtual-host: /
    #开启确认模式
    publisher-confirm-type: correlated
    #开启退回模式
    publisher-returns: true


#日志格式
logging:
  pattern:
    console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}:%msg%n)'

 生产者

    @Test
    public void testReturn(){
        // 定义退回模式的回调方法
     rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {
         /**
          * @param returned 失败后将失败信息封装发到参数中
          */
         @Override
         public void returnedMessage(ReturnedMessage returned) {
             System.out.println("消息对象:" + returned.getMessage());
             System.out.println("错误码:" + returned.getReplyCode());
             System.out.println("错误信息:" + returned.getReplyText());
             System.out.println("交换机:" + returned.getExchange());
             System.out.println("路由键:" + returned.getRoutingKey());
         }
     });
     rabbitTemplate.convertAndSend("boot_topic_exchange", "message","消息");
    }

3. ack签收

 application.yml配置

#配置rabbitmq
spring:
  rabbitmq:
    host: 192...
    port: 5672
    username: yygs
    password: yygs
    virtual-host: /
    #开启消息自动签收
    listener:
      simple:
        acknowledge-mode: none

#日志格式
logging:
  pattern:
    console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}:%msg%n)'

 消费者

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;

import java.io.IOException;


public class AckConsumer {
    @RabbitListener(queues = "boot_queue")
    public void listenMessage(Message message, Channel channel) throws IOException {
        // 消息投递序号,消息每次投递该值都会+1
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            // 签收消息
            System.out.println(new String(message.getBody()));
            /**
             * 参数1:消息投递序号
             * 参数2:是否一次可以签收多条消息
             */
            channel.basicAck(deliveryTag, true);
        }catch (Exception e) {
            // 拒签消息
            /**
             * 参数1:消息投递序号
             * 参数2:是否一次可以签收多条消息
             * 参数3:拒签后消息是否重回队列
             */
            channel.basicNack(deliveryTag, true, true);
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot框架可以很容易地与RabbitMQ进行集成。为了实现这个目标,你需要在项目的依赖项中添加两个关键的依赖项。首先,你需要添加spring-boot-starter-amqp依赖项,它提供了与RabbitMQ进行通信的必要类和方法。其次,你还需要添加spring-boot-starter-web依赖项,以便在项目中使用Web功能。 在你的项目中创建两个Spring Boot应用程序,一个是RabbitMQ的生产者,另一个是消费者。通过这两个应用程序,你可以实现消息的发送和接收。生产者应用程序负责将消息发送到RabbitMQ的消息队列,而消费者应用程序则负责从队列中接收并处理消息。这样,你就可以实现基于RabbitMQ的消息传递系统。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot整合RabbitMQ](https://blog.csdn.net/K_kzj_K/article/details/106642250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Springboot 整合RabbitMq ,用心看完这一篇就够了](https://blog.csdn.net/qq_35387940/article/details/100514134)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [undefined](undefined)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值