消息队列 - 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
在绑定了队列的消费者中定义消费逻辑