SpringBoot 集成 rabbitMq 消息队列
业务:现有文章列表,文章数据表为mysql,使用ElasticSearch搜索引擎,希望通过rabbitMq处理ElasticSearch的增删改业务。
在对文章做增删改的业务时,首先对数据做数据库存储,存储完成后将操作信息以消息队列形式发送给服务端消费,服务端接收到消息后,再对ES做相关操作。
上述业务将使用rabbitMq 的直连交换机模型处理,即指定两个routing key,分别为save、delete,创建两个消息队列,服务端分别监听两种操作行为。
添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
添加配置
# rabbitMq配置
spring.rabbitmq.host=192.168.31.132
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
创建更新监听类、删除监听类
@Component
public class NewsSaveListener {
//ES 文章处理类
@Autowired
private NewsDocSearchService newsDocSearchService;
@RabbitListener(queues = "newsSaveQueue")
public void saveNews(News news) throws Exception {
if(news !=null && StringUtil.isNotBlank(news.getId())){
//删除ES中的数据
newsDocSearchService.delete(news.getId());
//添加ES新数据
NewsDoc newsDoc = new NewsDoc();
BeanUtils.copyProperties(news,newsDoc);
newsDocSearchService.save(newsDoc);
}
}
}
@Component
public class NewsDeleteListener {
//ES 文章处理类
@Autowired
private NewsDocSearchService newsDocSearchService;
@RabbitListener(queues = "newsDeleteQueue")
public void saveNews(News news) throws Exception {
if(news !=null && StringUtil.isNotBlank(news.getId())){
//删除ES中的数据
newsDocSearchService.delete(news.getId());
}
}
}
创建config类,绑定交换机
@Configuration
public class NewsExchangeConfig {
@Bean
public DirectExchange directExchange(){
DirectExchange directExchange=new DirectExchange("direct");
return directExchange;
}
@Bean
public Queue newsSaveQueue() {
Queue queue=new Queue("newsSaveQueue");
return queue;
}
@Bean
public Queue newsDeleteQueue() {
Queue queue=new Queue("newsDeleteQueue");
return queue;
}
//2个binding将交换机和相应队列连起来
@Bean
public Binding bindingorange(){
Binding binding= BindingBuilder.bind(newsSaveQueue()).to(directExchange()).with("save");
return binding;
}
@Bean
public Binding bindingblack(){
Binding binding= BindingBuilder.bind(newsDeleteQueue()).to(directExchange()).with("delete");
return binding;
}
}
创建消息生产者
//注入rabbitmq
@Autowired
private RabbitTemplate rabbitTemplate;
//在添加、修改的业务中发布消息
rabbitTemplate.convertAndSend("direct", "save", news);
//在删除的业务中发布消息
rabbitTemplate.convertAndSend("direct", "delete", news);