消息队列 - RabbitMQ 集成 SpringBoot (Simplest)
这是史上最简单的 SpringBoot & RabbitMQ 集成的 demo!
一、依赖配置
对于 Java SE ,RabbitMQ 提供了 amqp-client 依赖
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>3.6.5</version>
</dependency>
对于 SpringBoot,RabbitMQ 也适配了对应的 amqp-client 依赖
<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>3.6.5</version>
</dependency>
那么,建立一个项目,导入以下依赖:
- amqp:使用 RabbitMQ 要用的依赖
- hutool:开源的常用工具类,这里用来做日志
- test:用来做单元测试
- lombok :这里我用来精简 bean 的操作
<dependencies>
    <!--    amqp    -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.2.2.RELEASE</version>
    </dependency>
    <!--    hutool    -->
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>4.3.1</version>
    </dependency>
    <!--    test    -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>2.2.2.RELEASE</version>
        <scope>test</scope>
    </dependency>
    
        <!--    lombok 依赖    -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.10</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
之后需要配置一下项目使用的队列服务信息:
spring:
  rabbitmq:
    host: localhost
    port: 5672
    # 登录 15672 端口后台的用户名和密码
    username: admin
    password: admin
- host :RabbitMQ 的服务地址
- port :RabbitMQ 的服务端口(不是管理后台插件的端口,是本身的服务端口)
- username :RabbitMQ 的管理后台插件的账户
- password : RabbitMQ 的管理后台插件的密码
常见的是管理后台插件的端口是 15672,而 RabbitMQ 的管理后台插件的端口是 5672 / 5671 ,这个可以查本机服务
这里的 username 和 password 是我自己在后台新加的,默认的用户密码都是 guest
二、配置类
一般创建在 RabbitMQ & SpringBoot 中的常见操作,如创建队列,交换器,绑定,处理器都会写一个 RabbitMQ 配置类,然后在里面用 @Bean 注入创建
@Configuration
public class RabbitMqConfig {
    /**
     * 创建一个队列,名字未 springboot-queue-hello
     *
     * @return AMQP 模型中的队列
     */
    @Bean
    public Queue queue() {
        return new Queue("springboot-queue-hello");
    }
}
三、生产者
发送消息到名为 springboot-queue-hello 的队列中
创建一个 bean
@Data
@Accessors(chain = true)
public class Book implements Serializable {
    private Integer id;
    private String name;
    private Integer price;
}
创建生产者,分别生成字符消息和对象消息(这里指定的对象是 Book)
@Component
public class Producer {
    private static final Log LOGGER = LogFactory.get();
    @Autowired
    private AmqpTemplate rabbitTemplate;
    public void produceHelloMessage() {
        String strMessage = "RabbitMQ-SpringBoot | Hello message " + new Date();
        LOGGER.warn("Producer :" + strMessage);
        this.rabbitTemplate.convertAndSend("springboot-queue-hello", strMessage);
    }
    public void produceObjMessage() {
        Book bookMessage = new Book()
            .setId(1)
            .setName(" 《 Jalr4ever's Blog 》 ")
            .setPrice(100);
        LOGGER.warn("Producer: " + bookMessage);
        this.rabbitTemplate.convertAndSend("springboot-queue-hello",bookMessage);
    }
}
四、消费者
监听名字为 springboot-queue-hello 的队列,如果有消息,则消费消息
@Component
@RabbitListener(queues = "springboot-queue-hello")
public class Consumer {
    private static final Log LOGGER = LogFactory.get();
    @RabbitHandler()
    public void consumeStrMessage(String helloMsg) {
        LOGGER.warn("Consumer : " + helloMsg);
    }
    @RabbitHandler
    public void consumeObjMessage(Book objMsg) {
        LOGGER.warn("Consumer : " + objMsg);
    }
}
五、测试
创建一个生产者的生产方法的测试方法:
@SpringBootTest
@RunWith(SpringRunner.class)
public class ProducerTest {
    @Autowired
    private Producer producer;
    @Test
    public void produce() {
        this.producer.produce();
    }
}
可以看到生产者和消费者的字符消息通讯正常

六、总结
本次简单的 demo 用到的 AMQP 注解有:
- @RabbitListener用来将消费者绑定到队列
- @RabbitHandler在绑定了队列的消费者中定义消费逻辑
0