Spring Boot 中的 RabbitMQ 是什么,如何使用

这篇具有很好参考价值的文章主要介绍了Spring Boot 中的 RabbitMQ 是什么,如何使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Boot 中的 RabbitMQ 是什么,如何使用

简介

RabbitMQ 是一个开源的消息队列系统,它通过 AMQP(高级消息队列协议)来实现消息的传递。Spring Boot 是目前非常流行的 Java 开发框架,它提供了很多便利性的功能,其中就包括对 RabbitMQ 的支持。

在本文中,我们将介绍 RabbitMQ 的基本概念,以及如何在 Spring Boot 中使用 RabbitMQ。

Spring Boot 中的 RabbitMQ 是什么,如何使用,Java 教程,java-rabbitmq,spring boot,rabbitmq

RabbitMQ 的基本概念

在使用 RabbitMQ 之前,我们需要了解一些基本概念。

消息队列

消息队列是一种用于异步通信的机制。消息发送者将消息发送到队列中,消息接收者从队列中获取消息。通过消息队列,可以实现消息的异步传递,降低系统之间的耦合性。

消息

消息是指需要传递的数据。

生产者

生产者是指向消息队列发送消息的程序。

消费者

消费者是指从消息队列中获取消息并处理的程序。

队列

队列是指消息存储的地方。

交换机

交换机是用于接收生产者发送的消息,并将消息路由到相应的队列中。

路由键

路由键是一个字符串,用于指定消息应该被路由到哪个队列中。

绑定

绑定是指将队列和交换机连接起来的过程。

如何在 Spring Boot 中使用 RabbitMQ

添加依赖

首先,我们需要在 Maven 或 Gradle 中添加 RabbitMQ 的依赖。在 Maven 中,我们可以添加以下依赖:

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

在 Gradle 中,我们可以添加以下依赖:

implementation 'org.springframework.boot:spring-boot-starter-amqp'

配置 RabbitMQ

在 Spring Boot 中,我们可以使用 application.yml 或者 application.properties 文件来配置 RabbitMQ。

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

创建生产者

下面是一个简单的 RabbitMQ 生产者示例:

@Component
public class RabbitMQProducer {
    private final RabbitTemplate rabbitTemplate;

    public RabbitMQProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void send(String message) {
        rabbitTemplate.convertAndSend("myExchange", "myRoutingKey", message);
    }
}

在这个示例中,我们使用了 Spring AMQP 提供的 RabbitTemplate 类来发送消息。convertAndSend 方法用于将消息发送到指定的交换机和路由键。

创建消费者

下面是一个简单的 RabbitMQ 消费者示例:

@Component
public class RabbitMQConsumer {
    @RabbitListener(queues = "myQueue")
    public void receive(String message) {
        System.out.println("Received message: " + message);
    }
}

在这个示例中,我们使用了 Spring AMQP 提供的 @RabbitListener 注解来指定消费者应该监听哪个队列。当有消息到达队列时,receive 方法会被调用,并且接收到消息的内容会作为参数传递给该方法。

运行示例

现在我们已经创建了一个简单的 RabbitMQ 应用程序。我们可以在 main 方法中创建 Spring Boot 应用程序,并在其中注入我们的生产者和消费者。然后,我们可以使用生产者向队列发送消息,消费者将会接收到这些消息并输出到控制台。

@SpringBootApplication
public class Application implements CommandLineRunner {
    private final RabbitMQProducer rabbitMQProducer;
    private final RabbitMQConsumer rabbitMQConsumer;

    public Application(RabbitMQProducer rabbitMQProducer, RabbitMQConsumer rabbitMQConsumer) {
        this.rabbitMQProducer = rabbitMQProducer;
        this.rabbitMQConsumer = rabbitMQConsumer;
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        rabbitMQProducer.send("Hello, RabbitMQ!");
    }
}

运行程序后,我们可以在控制台看到类似于以下输出:

Received message: Hello, RabbitMQ!

这表明我们已经成功地向队列发送了一条消息,并且消费者已经成功地接收到了这个消息。

RabbitMQ 高级功能

除了基本功能之外,RabbitMQ 还提供了一些高级功能,例如:

消息确认

当生产者发送一条消息时,它并不知道这条消息是否已经被成功处理。如果消息没有被成功处理,生产者将会不断地尝试重发这条消息,直到它被成功处理为止。

为了解决这个问题,RabbitMQ 提供了消息确认机制。当生产者发送一条消息时,它可以请求 RabbitMQ 确认这条消息是否已经被成功处理。如果消息已经被成功处理,RabbitMQ 将会发送一个确认消息给生产者。

@Component
public class RabbitMQProducer {
    private final RabbitTemplate rabbitTemplate;

    public RabbitMQProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void send(String message) {
        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
        rabbitTemplate.convertAndSend("myExchange", "myRoutingKey", message, correlationData);
    }

    @Bean
    public ConfirmCallback confirmCallback() {
        return (correlationData, ack, cause) -> {
            if (ack) {
                System.out.println("Message with correlation id " + correlationData.getId() + " has been confirmed");
            } else {
                System.out.println("Message with correlation id " + correlationData.getId() + " has been rejected: " + cause);
            }
        };
    }
}

在这个示例中,我们在生产者中使用了 CorrelationData 类来跟踪消息。我们还创建了一个 ConfirmCallback bean 来处理消息确认。当消息被成功处理时,confirmCallback 方法将会被调用,并输出一条确认消息。当消息被拒绝时,confirmCallback 方法也将会被调用,并输出一条拒绝消息。

消息持久化

默认情况下,RabbitMQ 不会将消息持久化到磁盘上。如果 RabbitMQ 在崩溃之前没有将消息发送给消费者,这些消息将会丢失。

为了解决这个问题,我们可以将消息标记为持久化。这样,即使 RabbitMQ 崩溃,消息也会被保存到磁盘上,并在 RabbitMQ 重启后重新发送给消费者。

@Component
public class RabbitMQProducer {
    private final RabbitTemplate rabbitTemplate;

    public RabbitMQProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void send(String message) {
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
        Message messageObject = new Message(message.getBytes(), messageProperties);
        rabbitTemplate.send("myExchange", "myRoutingKey", messageObject);
    }
}

在这个示例中,我们在生产者中使用了 MessageProperties 类来设置消息的持久化属性。我们还使用了 MessageDeliveryMode.PERSISTENT 枚举值来标记消息为持久化消息。

消息 TTL

消息 TTL(Time To Live)是指消息在队列中存储的时间。如果消息在指定的时间内没有被消费者消费,它将会被从队列中自动删除。

@Component
public class RabbitMQProducer {
    private final RabbitTemplate rabbitTemplate;

    public RabbitMQProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void send(String message) {
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setExpiration("5000"); // 5 seconds
        Message messageObject = new Message(message.getBytes(), messageProperties);
        rabbitTemplate.send("myExchange", "myRoutingKey", messageObject);
    }
}

在这个示例中,我们在生产者中使用了 MessageProperties 类来设置消息的 TTL 属性。我们将 messageProperties.setExpiration("5000") 设置为 5000 毫秒,这意味着消息在队列中最多存储 5 秒钟。

死信队列

死信队列是指当消息被拒绝或者过期时,它将会被重新路由到另一个队列中。这个队列就被称为死信队列。

@Configuration
public class RabbitMQConfig {
    @Bean
    public Queue myQueue() {
        return QueueBuilder.durable("myQueue")
                .withArgument("x-dead-letter-exchange", "myDeadLetterExchange")
                .withArgument("x-dead-letter-routing-key", "myDeadLetterRoutingKey")
                .build();
    }

    @Bean
    public Queue myDeadLetterQueue() {
        return QueueBuilder.durable("myDeadLetterQueue").build();
    }

    @Bean
    public Exchange myExchange() {
        return ExchangeBuilder.directExchange("myExchange").durable(true).build();
    }

    @Bean
    public Exchange myDeadLetterExchange() {
        return ExchangeBuilder.directExchange("myDeadLetterExchange").durable(true).build();
    }

    @Bean
    public Binding binding() {
        return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey").noargs();
    }

    @Bean
    public Binding deadLetterBinding() {
        return BindingBuilder.bind(myDeadLetterQueue()).to(myDeadLetterExchange()).with("myDeadLetterRoutingKey").noargs();
    }
}

在这个示例中,我们创建了一个名为 myQueue 的队列,并使用 withArgument 方法来指定它的死信交换机和路由键。我们还创建了一个名为 myDeadLetterQueue 的队列,并将其绑定到名为 myDeadLetterExchange 的交换机上。最后,我们创建了绑定,将 myQueue 队列绑定到 myExchange 交换机上。

当消息在 myQueue 中被拒绝或过期时,它将会被重新路由到 myDeadLetterExchange 交换机,并将其路由到 myDeadLetterQueue 队列中。

总结

本文介绍了 RabbitMQ 的基本概念,以及如何在 Spring Boot 中使用 RabbitMQ。我们还介绍了 RabbitMQ 的一些高级功能,包括消息确认、消息持久化、消息 TTL 和死信队列。通过学习本文,你应该已经有了足够的知识来开始在 Spring Boot 中使用 RabbitMQ 了。文章来源地址https://www.toymoban.com/news/detail-519771.html

到了这里,关于Spring Boot 中的 RabbitMQ 是什么,如何使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 中的 WebSocketSession 是什么,原理,如何使用

    在现代 Web 应用程序中,实时通信是一个非常常见的需求。传统的 HTTP 协议是无法支持实时通信的,因为它是一种无状态协议,每次请求都是独立的,无法保持连接。为了解决这个问题,WebSocket 协议被引入。WebSocket 协议是一种双向通信协议,它允许服务器和客户端之间建立持

    2024年02月12日
    浏览(49)
  • Spring Boot 中的 WebMvc 是什么,原理,如何使用

    在 Spring Boot 中,WebMvc 是非常重要的一个模块。它提供了一系列用于处理 Web 请求的组件和工具。在本文中,我们将介绍 Spring Boot 中的 WebMvc 是什么,其原理以及如何使用它来处理 Web 请求。 WebMvc 是 Spring 框架中的一个模块,它提供了一系列用于处理 Web 请求的组件和工具。它

    2024年02月11日
    浏览(50)
  • Spring Boot 中的 RedisCacheManager 是什么,原理,如何使用

    在现代应用程序中,缓存是提高应用程序性能的重要组成部分。Spring Boot 提供了一个强大的缓存框架,它支持多种缓存提供程序,包括 Redis、Ehcache、Caffeine 等。在本文中,我们将重点介绍 Spring Boot 中的 RedisCacheManager,并探讨它的原理和如何使用它来提高应用程序的性能。

    2024年02月10日
    浏览(53)
  • Spring Boot 中的 CompletableFuture 类是什么,如何使用?

    在开发企业级应用程序时,我们经常需要异步执行任务。异步执行任务可以提高应用程序的性能和响应能力。在 Java 8 中,引入了 CompletableFuture 类,它提供了一种简单而强大的方式来执行异步任务。 Spring Boot 中的 CompletableFuture 类是基于 Java 8 的 CompletableFuture 类构建的。它提

    2024年02月15日
    浏览(42)
  • Spring Boot 中的 @FeignClient 注解是什么,原理,如何使用

    在微服务架构中,服务之间的调用是非常频繁的。为了简化服务之间的调用,Spring Boot 提供了一个叫做 Feign 的组件。Feign 可以帮助我们定义和实现服务之间的 RESTful 接口,使得服务之间的调用更加方便和可靠。在本文中,我们将深入探讨 Spring Boot 中的 @FeignClient 注解是什么,

    2024年02月09日
    浏览(58)
  • Spring Boot 中的 @ComponentScan 注解是什么,原理,如何使用

    在 Spring Boot 中,@ComponentScan 是一种注解,它可以让 Spring 自动扫描指定的包及其子包中的组件,并将这些组件自动装配到 Spring 容器中。本文将介绍 @ComponentScan 的原理以及如何在 Spring Boot 中使用它。 在 Spring 中,组件是指那些被 Spring 管理的对象,比如 Bean、Controller、Servic

    2024年02月11日
    浏览(47)
  • Spring Boot 中的 @PutMapping 注解是什么,原理,如何使用

    在 Spring Boot 中,@PutMapping 是一种注解,它可以将 HTTP PUT 请求映射到指定的处理方法上。本文将介绍 @PutMapping 的原理以及如何在 Spring Boot 中使用它。 在 RESTful API 中,PUT 请求常用于更新资源。例如,我们可以使用 PUT 请求将一个用户的信息更新到服务器上。在 Spring Boot 中,我

    2024年02月08日
    浏览(48)
  • Spring Boot 中的 @RabbitListener 注解是什么,原理,如何使用

    在 RabbitMQ 中,消息的接收需要通过监听队列来实现。在 Spring Boot 应用程序中,可以使用 @RabbitListener 注解来监听队列,并在接收到消息时执行指定的方法。本文将介绍 @RabbitListener 注解的原理、使用方法和常见应用场景。 @RabbitListener 注解是 Spring AMQP 框架中的一个关键组件,

    2024年02月09日
    浏览(64)
  • Spring Boot中的SimpMessagingTemplate是什么,原理,以及如何使用

    SimpMessagingTemplate是Spring Framework中的一个类,用于向WebSocket客户端发送消息。在Spring Boot应用程序中,可以使用SimpMessagingTemplate来实现WebSocket通信的消息发送功能。本文将介绍SimpMessagingTemplate的原理和使用方法。 SimpMessagingTemplate是Spring Framework中的一个类,用于向WebSocket客户端

    2024年02月09日
    浏览(47)
  • Spring Boot 中的 @RefreshScope 注解是什么,原理,如何使用

    在 Spring Boot 中,@RefreshScope 注解是一个非常有用的注解。它可以让 Spring Boot 应用程序在运行时重新加载配置。这意味着您可以在不停止和重新启动应用程序的情况下更改配置。在本文中,我们将介绍 @RefreshScope 注解的原理和如何在 Spring Boot 应用程序中使用它。 @RefreshScope 是

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包