为了实现服务的异步操作,比较常用的就是消息队列了,之前一直是依葫芦画瓢的调包侠客,这次还是稍微的了解了一下在Spring
如何使用RabbitMQ
实现消息的收发。
MQ介绍
消息流程
一条消息从生产者出发到消费者之间经历的流程如下图:
消息进入交换机后会绑定一个Route Key然后根据交换机的匹配模式发送到对应Binding Key的Queue中。
匹配模式主要有三种
1.Direct 路由模式 根据Route Key全文匹配Binding Key去寻找队列。
2.Fanout 广播模式 发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
3.Topic 根据通配符,发送到匹配队列。
虚拟主机(virtual_host)
消息消费者
一、监听容器的创建
接收消息可以使用Spring提供的@RabbitListener
注解
想要用@RabbitListener
接收消息的需要创建SimpleRabbitListenerContainerFactory
,默认情况下,基础组件将查找名为rabbitListenerContainerFactory的bean作为工厂用于创建消息监听器容器的源。
@Bean("customizeContainerFactory")
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(
ConnectionFactory connectionFactory,
@Qualifier(RABBIT_TASK_EXECUTOR) TaskExecutor taskExecutor) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
factory.setTaskExecutor(taskExecutor);
factory.setMessageConverter(new Jackson2JsonMessageConverter(getObjectMapper(enumPropName)));
return factory;
}
不管是接收还是发送消息都需要使用ConnectionFactory
在上面的代码中使用了Spring抽象的ConnectionFactory。SimpleRabbitListenerContainerFactory
可以设置Ack模式,消息转换器等。
二、监听方法
i. 把@RabbitListener
加在接收消息的方法上,该注解可以用来定义MQ中不存在的queue
、exchange
、route key
和binding key
public class Consumer {
@RabbitListener(containerFactory = "customizeContainerFactory",
bindings = @QueueBinding(value = @Queue(value = "queue_name", durable = true),
exchange = @Exchange