1 简介

  • 在Spring项目中,可以使用Spring-Rabbit去操作RabbitMQ。尤其是在SpringBoot项目中只需要引入对应的amqp的启动器依赖即可,可以很方便的使用RabbitTemplate发送消息,使用注解接收消息。
  • 一般的开发过程中:
  • SpringBoot整合RabbitMQ - 图1生产者工程:
    • ①application.yaml文件中配置RabbitMQ的相关信息。
    • ②在生产者工程中编写配置类,用于创建交换机和队列,并进行绑定。
    • ③注入RabbitTemplate对象,通过RabbitTemplate对象发送消息到交换机。
  • SpringBoot整合RabbitMQ - 图2消费者工程:
    • ①application.yaml文件配置RabbitMQ的相关信息。
    • ②创建消息处理类,用于接收队列中的消息并进行处理。

2 创建总工程

2.1 创建总工程

  • 略。

创建总工程.png

2.2 导入依赖

  • pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <packaging>pom</packaging>
  6. <modules>
  7. <module>rabbitmq-producer</module>
  8. <module>rabbitmq-consumer</module>
  9. </modules>
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>2.3.8.RELEASE</version>
  14. <relativePath/>
  15. </parent>
  16. <groupId>com.example</groupId>
  17. <artifactId>rabbitmq-demo</artifactId>
  18. <version>1.0</version>
  19. <name>rabbitmq-demo</name>
  20. <properties>
  21. <java.version>1.8</java.version>
  22. </properties>
  23. <dependencies>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-amqp</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-web</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. <exclusions>
  37. <exclusion>
  38. <groupId>org.junit.vintage</groupId>
  39. <artifactId>junit-vintage-engine</artifactId>
  40. </exclusion>
  41. </exclusions>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.amqp</groupId>
  45. <artifactId>spring-rabbit-test</artifactId>
  46. <scope>test</scope>
  47. </dependency>
  48. </dependencies>
  49. <build>
  50. <plugins>
  51. <plugin>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-maven-plugin</artifactId>
  54. </plugin>
  55. </plugins>
  56. </build>
  57. </project>

2.3 创建生产者和消费者工程

  • 略。

3 搭建生产者工程

3.1 创建工程

  • 略。

3.2 导入依赖

  • 略(父工程已经导入)。

3.3 启动类

  • 启动类:
  1. package com.xudaxian;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. /**
  5. * @version 1.0
  6. * @since 2021-02-04 22:11
  7. */
  8. @SpringBootApplication
  9. public class ProducerApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(ProducerApplication.class, args);
  12. }
  13. }

3.4 配置RabbitMQ

3.4.1 配置文件

  • 创建application.yml文件,内容如下:
  1. server:
  2. # 端口
  3. port: 8888
  4. spring:
  5. # RabbitMQ
  6. rabbitmq:
  7. host: 192.168.49.100
  8. port: 5672
  9. virtual-host: /xudaxian
  10. username: xudaxian
  11. password: 123456

3.4.2 绑定交换机和队列

  • 创建RabbitMQConfig.java文件,内容如下:
  1. package com.xudaxian.config;
  2. import org.springframework.amqp.core.*;
  3. import org.springframework.amqp.rabbit.connection.ConnectionFactory;
  4. import org.springframework.amqp.rabbit.core.RabbitAdmin;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. /**
  9. * @version 1.0
  10. * @since 2021-02-05 08:45
  11. */
  12. @Configuration
  13. public class RabbitMQConfig {
  14. //交换机名称
  15. public static String EXCHANGE_NAME = "xudaxian_topic_exchange";
  16. //队列名称
  17. public static String QUEUE_NAME = "xudaxian_queue";
  18. //声明交换机
  19. @Bean
  20. public Exchange exchange() {
  21. return ExchangeBuilder.topicExchange(EXCHANGE_NAME).durable(true).build();
  22. }
  23. //声明队列
  24. @Bean
  25. public Queue queue() {
  26. return QueueBuilder.durable(QUEUE_NAME).build();
  27. }
  28. //绑定交换机和队列
  29. @Bean
  30. public Binding binding(@Autowired Queue queue, @Autowired Exchange exchange) {
  31. return BindingBuilder.bind(queue).to(exchange).with("item.#").noargs();
  32. }
  33. /**
  34. * 如果不配置RabbitAdmin,默认情况下,SpringBoot启动的时候是不会自动创建交换机和消息队列的,而是等到发送消息的时候
  35. *
  36. * @param connectionFactory
  37. * @return
  38. */
  39. @Bean
  40. public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
  41. RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
  42. //只有设置为true的时候,SpringBoot启动的时候会加载RabbitAdmin
  43. rabbitAdmin.setAutoStartup(true);
  44. rabbitAdmin.declareExchange(exchange());
  45. rabbitAdmin.declareQueue(queue());
  46. return rabbitAdmin;
  47. }
  48. }

3.5 消息发送的Controller

  • 创建ProducerController.java文件,内容如下:
  1. package com.xudaxian.web;
  2. import com.xudaxian.config.RabbitMQConfig;
  3. import org.springframework.amqp.rabbit.core.RabbitTemplate;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7. import org.springframework.web.bind.annotation.RestController;
  8. /**
  9. * @version 1.0
  10. * @since 2021-02-04 22:27
  11. */
  12. @RestController
  13. public class ProducerController {
  14. @Autowired
  15. private RabbitTemplate rabbitTemplate;
  16. /**
  17. * @param msg 发送的消息
  18. * @param routingKey 路由key
  19. * @return
  20. */
  21. @GetMapping(value = "/sendMessage")
  22. public String sendMessage(@RequestParam(value = "msg") String msg, @RequestParam(value = "routingKey") String routingKey) {
  23. rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, routingKey, msg);
  24. return "发送消息成功";
  25. }
  26. }

3.6 测试

4 搭建消费者工程

4.1 创建工程

  • 略。

4.2 导入依赖

  • 略(父工程已经导入)。

4.3 启动类

  • 启动类:
  1. package com.xudaxian;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. /**
  5. * @version 1.0
  6. * @since 2021-02-04 22:40
  7. */
  8. @SpringBootApplication
  9. public class ConsumerApplication {
  10. public static void main(String[] args) {
  11. SpringApplication.run(ConsumerApplication.class, args);
  12. }
  13. }

4.4 配置RabbitMQ

  • 创建application.yml文件,内容如下:
  1. server:
  2. # 端口
  3. port: 8889
  4. spring:
  5. # RabbitMQ
  6. rabbitmq:
  7. host: 192.168.49.100
  8. port: 5672
  9. virtual-host: /xudaxian
  10. username: xudaxian
  11. password: 123456
  • 创建RabbitMQConfig.java文件,内容如下:
  1. package com.xudaxian.config;
  2. import org.springframework.amqp.core.Queue;
  3. import org.springframework.amqp.core.QueueBuilder;
  4. import org.springframework.amqp.rabbit.connection.ConnectionFactory;
  5. import org.springframework.amqp.rabbit.core.RabbitAdmin;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. /**
  9. * @version 1.0
  10. * @since 2021-02-06 10:55
  11. */
  12. @Configuration
  13. public class RabbitMQConfig {
  14. public static String QUEUE_NAME = "xudaxian_queue";
  15. @Bean
  16. public Queue queue() {
  17. return QueueBuilder.durable(QUEUE_NAME).build();
  18. }
  19. /**
  20. * 如果不配置RabbitAdmin,默认情况下,SpringBoot启动的时候是不会自动创建交换机和消息队列的,而是等到发送消息的时候
  21. *
  22. * @param connectionFactory
  23. * @return
  24. */
  25. @Bean
  26. public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
  27. RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
  28. //只有设置为true的时候,SpringBoot启动的时候会加载RabbitAdmin
  29. rabbitAdmin.setAutoStartup(true);
  30. rabbitAdmin.declareQueue(queue());
  31. return rabbitAdmin;
  32. }
  33. }

4.5 消息监听处理类

  • 创建RabbitMQListener.java文件,内容如下:
  1. package com.xudaxian.listener;
  2. import org.springframework.amqp.rabbit.annotation.RabbitListener;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * @version 1.0
  6. * @since 2021-02-04 23:06
  7. */
  8. @Component
  9. public class RabbitMQListener {
  10. @RabbitListener(queues = "xudaxian_queue")
  11. public void listener(String message) {
  12. System.out.println("消费者接受到的消息:" + message);
  13. }
  14. }