使用消息中间件rabbitMQ的一点点理解--》topic方式
对交换机和队列进行统一管理
可以通过创建一个接口的方式,在接口中定义交换机与队列名称,如下图:
/**
* @author
* @Date
* 对队列和交换机进行统一管理
*/
public interface ProductRabbitConfig {
String QUEUE_NAME_PRODUCTADD="productAdd";
String EXCHANGE_NAME1="exchange1";
String PRODUCT_SEARCH_EXCHANGE="product_search_exchange";
String QUEUE_NAME_PRODUCTDEL="productDel";
String USER_CART_EXCHANGE = "user_cart_exchange";
String QUEUE_NAME_MERGECART = "mergecart";
}
消息中间件主要有两个角色
生产者
首先是生产者,在生产者中,通过rabbitTemplate的convertAndSend()方法发送异步消息至对列中, 具体实现如下:
首先需要在pom文件中引入依赖
<!--引入中间件的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
然后需要在生产者中配置交换机。
@Component
public class RabbitMQConfig {
@Bean
public TopicExchange getExchange(){
return new TopicExchange(ProductRabbitConfig.PRODUCT_SEARCH_EXCHANGE,true,false);
}
}
交换机配置完成后,再在生产者的方法中,发送消息到队列
rabbitTemplate.convertAndSend(ProductRabbitConfig.USER_CART_EXCHANGE,"merge_cart",request);
至此,生产者中的事已经完成了。
消费者
与生产者一样,首先需要引入rabbitMQ的依赖,如上。
其次,创建一个配置文件,与生产者不同的是,消费者需要声明队列,交换机以及将两者绑定在一起。
@Configuration
public class RabbitMQConfig {
@Bean
public Queue getQueue(){
return new Queue(ProductRabbitConfig.QUEUE_NAME_PRODUCTADD,false,false,false);
}
@Bean
public TopicExchange getExchange(){
return new TopicExchange(ProductRabbitConfig.PRODUCT_SEARCH_EXCHANGE,true,false);
}
@Bean
public Binding bind(Queue getQueue,TopicExchange exchange){
return BindingBuilder.bind(getQueue).to(exchange).with("product.add");
}
@Bean
public Queue getDelQueue(){
return new Queue(ProductRabbitConfig.QUEUE_NAME_PRODUCTDEL,false,false,false);
}
@Bean
public Binding bind1(Queue getDelQueue,TopicExchange exchange){
return BindingBuilder.bind(getDelQueue).to(exchange).with("product.del");
}
}
这里需要注意的是:
1,一个交换机可以绑定多个队列,但是在绑定时,因为没有给@bean指定名称,所以默认按照方法名称自动注入队列,比如方法名称是getQueue,那么在spring眼里,自动注入的队列名称就是getQueue,所以如果需要配置多条队列时,绑定交换机时需要注意队列不要弄错了!!
2,创建交换机时,durable(持久化),autodelete(自动删除)参数一定要和生产者中对应的交换机参数一致,否则会报错.
最后,建议再在创建一个单独用来处理消息队列的类,这样会比较清晰
@Component
public class ProductComsumer {
@Reference
private ISearchService searchService;
@RabbitListener(queues = ProductRabbitConfig.QUEUE_NAME_PRODUCTADD)
@RabbitHandler
public void recv(Long id){
searchService.updateData(id);
System.out.println("更新成功!");
}
@RabbitListener(queues = ProductRabbitConfig.QUEUE_NAME_PRODUCTDEL)
@RabbitHandler
public void del(Long id){
searchService.delById(id);
}
}
以上