SpringBoot使用了Spring AMQP来操作RabbitMQ,官网也提供了很多示例,同时RabbitMQ的官网也针对每种消息类型提供了AMQP版的实现。这里以Work Queues为例,看看如何在SpringBoot中使用Spring AMQP。
1.准备工作
-
引入RabbitMQ的Starters。如果你是STS,可以右键pom.xml文件,选择Spring -> Edit Starters,搜索并勾选RabbitMQ。
-
在application.yaml文件中,配置RabbitMQ的连接属性
spring:
rabbitmq:
host: 192.168.128.135
port: 5672
virtual-host: /chenbin
username: chenbin
password: chenbin
- 在@SpringBootApplication标注的类上,加入@EnableRabbit注解
//使@RabbitListener生效
@EnableRabbit
@SpringBootApplication
public class ElasticsearchApplication {
public static void main(String[] args) {
SpringApplication.run(ElasticsearchApplication.class, args);
}
}
2.创建队列和消费者
新建一个配置类,我们来创建队列和消费者。项目启动时,创建@Bean指定的对象,同时会在RabbitMQ创建对应的队列和消费者。Spring将会自动检测队列和消费者是否已经存在了,如果存在了,就不会再建了,避免了手动创建时会出现重复创建的问题。
/**
* RabbitMQ配置类
* 这里使用work queues模式
* 一个队列 两个消费者
* Spring AMQP默认已经帮我们实现了:
* ①队列/消息持久化
* ②手动应答
* ③公平分发,能者多劳
*/
@Configuration
public class RabbitMQConfig {
public static final String QUEUE_NAME = "index_queue";
// 向RabbitMQ发消息时,不用默认的序列化方式,使用json格式
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
// 创建队列 在该Bean加入Spring容器时就会创建该队列
@Bean
public Queue indexQueue() {
return new Queue(QUEUE_NAME);
}
// 创建消费者1
@Bean
public RabbitMQReceiver receiver1() {
return new RabbitMQReceiver();
}
// 创建消费者2
@Bean
public RabbitMQReceiver receiver2() {
return new RabbitMQReceiver();
}
}
因为是Work Queues模式,所以我们建了一个队列,两个消费者。之前使用amqp-client.jar时,持久化,手动应答,公平分发都需要自己来实现,现在Spring AMQP默认已经实现了这些功能,详情可参见RabbitMQ的官方文档
3. 生产者发送消息
使用RabbitTemplate来发送消息
@Autowired
RabbitTemplate rabbitTemplate;
//自定义的消息bean
RabbitMessage rabbitMessage = new RabbitMessage();
rabbitTemplate.convertAndSend(RabbitMQConfig.QUEUE_NAME,rabbitMessage);
4. 消费者接收消息
@RabbitListener 指明消费者监听的队列
@RabbitHandler 收到消息后,触发对应的方法
//从指定队列中接收消息
@RabbitListener(queues=RabbitMQConfig.QUEUE_NAME)
public class RabbitMQReceiver {
@RabbitHandler
public void handleMessage(RabbitMessage rabbitMessage) throws InterruptedException {
//这里根据业务逻辑对收到的消息进行处理
}
}
可以看到,使用Spring AMQP还是很简单的,很多东西都帮你封装好了,这或许是Spring这个生态系统如此流行的一个重要原因吧。如果你需要其他消息类型比如Routing,Tpoics,可以参看RabbitMQ官网上AMQP版的实现。
网友评论