前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手带你了解RabbitMQ,附带集成SpringMvc!!!!

手把手带你了解RabbitMQ,附带集成SpringMvc!!!!

原创
作者头像
Java king
发布2023-04-10 18:13:40
1.1K1
发布2023-04-10 18:13:40
举报
文章被收录于专栏:后端Java后端Java

天才寻找障碍,障碍创造天才

RabbitMQ是一个流行的开源消息中间件,被广泛用于分布式系统和企业应用中。它是一个可靠的、高效的、可扩展的、支持多种消息协议的消息队列系统。本文将介绍RabbitMQ的基础知识,包括其功能、Spring MVC的集成和各个功能点的介绍和使用方法。

简介

RabbitMQ是一个AMQP(高级消息队列协议)的开源实现。它基于Erlang语言开发,具有高度的可靠性和可扩展性。RabbitMQ可以实现消息的可靠传递、路由、消息队列和消息确认等功能。

功能介绍

RabbitMQ具有以下功能:

  • 消息传递:RabbitMQ允许应用程序通过消息传递进行通信,这使得不同的应用程序可以在不同的语言和操作系统之间进行通信。
  • 消息路由:RabbitMQ可以将消息从一个应用程序路由到另一个应用程序,这可以通过将消息发送到交换机和队列来完成。
  • 消息队列:RabbitMQ可以保存消息,直到消费者准备好接收它们。这使得应用程序可以以异步方式处理消息。
  • 消息确认:RabbitMQ可以确保消息已经到达队列或消费者,从而实现消息传递的可靠性。

集成SpringMvc

RabbitMQ可以与Spring框架集成,使得在Spring应用程序中使用RabbitMQ变得更加容易。下面是在Spring MVC中使用RabbitMQ的基本步骤:

代码语言:javascript
复制
添加RabbitMQ依赖:
<dependency>
    <groupId>org.springframework.amqp</groupId>
    <artifactId>spring-rabbit</artifactId>
    <version>2.3.9.RELEASE</version>
</dependency>
代码语言:javascript
复制
配置RabbitMQ连接:
@Configuration
public class RabbitConfig {

    @Value("${spring.rabbitmq.host}")
    private String host;

    @Value("${spring.rabbitmq.port}")
    private int port;

    @Value("${spring.rabbitmq.username}")
    private String username;

    @Value("${spring.rabbitmq.password}")
    private String password;

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host, port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        return connectionFactory;
    }
}
代码语言:javascript
复制
发送消息:
@Autowired
private RabbitTemplate rabbitTemplate;

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

代码语言:javascript
复制
接收消息:
@RabbitListener(queues = "myQueue")
public void receiveMessage(String message) {
    System.out.println("Received message: " + message);
}

各个功能点的介绍和使用方法

Exchange

Exchange是RabbitMQ中的一个重要组件,它用于路由消息到一个或多个队列。Exchange有四种类型:direct、topic、headers、fanout。

  • direct:直接匹配,根据消息的Routing Key将消息路由到与之绑定的队列。
  • topic:主题匹配,根据消息的Routing Key和主题匹配规则将消息路由到与之绑定的队列。
  • headers:根据消息的Headers中指定的键值对来路由消息,忽略Routing Key和绑定键。
  • fanout:广播消息,将消息路由到所有与之绑定的队列。

在Spring MVC中使用Exchange需要先声明,然后将其与Queue进行绑定,然后才能将消息发送到Exchange。具体使用方法可以参考下面的代码:

代码语言:javascript
复制
@Configuration
public class RabbitConfig {
​
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange("myDirectExchange");
    }
​
    @Bean
    public Queue myQueue() {
        return new Queue("myQueue");
    }
​
    @Bean
    public Binding binding() {
        return BindingBuilder.bind(myQueue()).to(directExchange()).with("myRoutingKey");
    }
}

上面的代码中,声明了一个名为“myDirectExchange”的Direct Exchange,并将其与一个名为“myQueue”的Queue绑定,绑定键为“myRoutingKey”。在发送消息时,可以将消息发送到Exchange,而不是直接发送到Queue:

代码语言:javascript
复制
@Autowired
private RabbitTemplate rabbitTemplate;
​
public void sendMessage(String message) {
    rabbitTemplate.convertAndSend("myDirectExchange", "myRoutingKey", message);
}

Queue

Queue是RabbitMQ中用于存储消息的对象,它可以持久化存储消息,保证消息在RabbitMQ服务器宕机或重启后不会丢失。在Spring MVC中使用Queue需要先声明,然后才能将其与Exchange进行绑定,具体使用方法可以参考下面的代码:

代码语言:javascript
复制
@Configuration
public class RabbitConfig {
​
    @Bean
    public Queue myQueue() {
        return new Queue("myQueue");
    }
​
    @Bean
    public Binding binding() {
        return BindingBuilder.bind(myQueue()).to(directExchange()).with("myRoutingKey");
    }
}

上面的代码中,声明了一个名为“myQueue”的Queue,并将其与之前声明的Direct Exchange绑定,绑定键为“myRoutingKey”。在接收消息时,可以使用@RabbitListener注解来监听Queue中的消息:

代码语言:javascript
复制
@RabbitListener(queues = "myQueue")
public void receiveMessage(String message) {
    System.out.println("Received message: " + message);
}

Message Acknowledgement

在RabbitMQ中,消息确认是非常重要的一个功能,它可以确保消息已经被消费者正确处理,如果消息没有被正确处理,则可以重新投递或丢弃。RabbitMQ提供了两种消息确认方式:自动确认和手动确认。

  • 自动确认:当消费者从队列中取出消息时,RabbitMQ会立即确认消息。这种方式简单、快速,但是有可能会丢失消息。
  • 手动确认:当消费者从队列中取出消息时,RabbitMQ不会立即确认消息,需要消费者手动调用确认方法来确认消息。这种方式可以保证消息不会丢失,但是需要消费者手动调用确认方法,增加了代码的复杂度。

在Spring MVC中,默认采用自动确认的方式,可以使用@RabbitListener注解来监听Queue中的消息,代码如下:

代码语言:javascript
复制
@RabbitListener(queues = "myQueue")
public void receiveMessage(String message) {
    System.out.println("Received message: " + message);
}

费者手动调用确认方法来确认消息。这种方式可以保证消息不会丢失,但是需要消费者手动调用确认方法,增加了代码的复杂度。

在Spring MVC中,默认采用自动确认的方式,可以使用@RabbitListener注解来监听Queue中的消息,代码如下:

代码语言:javascript
复制
typescriptCopy code
@RabbitListener(queues = "myQueue")
public void receiveMessage(String message) {
    System.out.println("Received message: " + message);
}

如果需要使用手动确认的方式,可以使用@RabbitListener注解的ackMode属性设置为MANUAL,然后在消费者处理完消息后调用channel.basicAck()方法手动确认消息:

代码语言:javascript
复制
@RabbitListener(queues = "myQueue", ackMode = "MANUAL")
public void receiveMessage(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
    try {
        System.out.println("Received message: " + message);
        // 手动确认消息
        channel.basicAck(tag, false);
    } catch (Exception e) {
        // 发生异常,拒绝消息
        channel.basicNack(tag, false, true);
    }
}

Conclusion

RabbitMQ是一款强大、可靠的消息中间件,它提供了各种丰富的功能,包括Exchange、Queue、消息确认等。在Spring MVC中,可以方便地集成RabbitMQ,通过声明Exchange和Queue,将它们绑定在一起,实现消息的发送和接收。熟练掌握RabbitMQ和Spring MVC的集成,对于构建高可靠、高可扩展性的分布式系统非常有帮助。

RabbitMQ是一款强大、可靠的消息中间件,具有以下优点:

  1. 灵活性:RabbitMQ支持多种消息协议、多种消息类型和多种消息路由策略,能够满足不同应用场景的需求。
  2. 可靠性:RabbitMQ采用消息确认和持久化机制,确保消息不会丢失,同时具备高可用性和容错性。
  3. 性能:RabbitMQ采用基于Erlang语言的AMQP协议,具备高吞吐量、低延迟和高并发性能。
  4. 易用性:RabbitMQ提供了多种客户端API,同时也支持多种语言和平台,能够方便地集成到不同的应用系统中。
  5. 可扩展性:RabbitMQ支持集群部署,能够实现负载均衡和水平扩展,满足大规模分布式应用的需求。

在实际应用中,我们可以将RabbitMQ应用到很多场景中,例如异步处理、任务队列、广播和日志处理等。通过深入了解RabbitMQ的各种功能,我们可以更好地应用它来解决实际问题。

在实际应用中,我们可以将RabbitMQ应用到很多场景中,例如异步处理、任务队列、广播和日志处理等。以下是RabbitMQ的一些常见应用场景:

  1. 异步处理:将需要异步处理的任务发送到RabbitMQ,然后由消费者处理完成后再将结果返回给生产者。这种方式可以避免因为任务阻塞而导致整个系统响应缓慢的情况。
  2. 任务队列:将任务发送到RabbitMQ的Queue中,由多个消费者并发处理。可以动态增加或减少消费者,从而实现任务的动态调度。此外,可以设置Queue的优先级,确保高优先级任务能够及时得到处理。
  3. 广播:将消息发送到RabbitMQ的Fanout Exchange中,Exchange会将消息发送到与之绑定的所有Queue中。这种方式可以用于系统广播、日志记录等场景。
  4. 日志处理:将系统的日志消息发送到RabbitMQ的Topic Exchange中,然后由消费者处理并将其存储到数据库中。可以使用多个Topic Exchange来分别处理不同类型的日志消息,提高处理效率。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 功能介绍
  • 集成SpringMvc
  • 各个功能点的介绍和使用方法
    • Exchange
      • Queue
        • Message Acknowledgement
          • Conclusion
          相关产品与服务
          消息队列 CMQ
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档