RabbitMQ 详解(四)------Spring集成RabbitMQ

1.基本概念

Spring AMQP 是对Spring 基于AMQP的消息收发解决方案,它是一个抽象层,不依赖于特定的 AMQP Broker 实现和客户端的抽象

<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>

2.核心组件

1.ConnectionFactory
   Spring AMQP 的连接工厂接口,用于创建连接。CachingConnectionFactory 是ConnectionFactory 的一个实现类。

 2.RabbitAdmin
   RabbitAdmin 是 AmqpAdmin 的实现,封装了对 RabbitMQ 的基础管理操作,比如对交换机、队列、绑定的声明和删除等、

// 声明一个交换机
   rabbitAdmin.declareExchange(new DirectExchange("EXCHANGE", false, false));
// 声明一个队列
   rabbitAdmin.declareQueue(new Queue("QUEUE", false, false, false));
// 声明一个绑定
   rabbitAdmin.declareBinding( new Binding("QUEUE", Binding.DestinationType.QUEUE,"EXCHANGE",   "admin", null));

 3.Message

Message 是 Spring AMQP 对消息的封装。包含两个重要的属性:body:消息内容; messageProperties:消息属性

  4.ReabbitTemplate 消息模板

 RabbitTemplate 是 AmqpTemplate 的一个实现,来简化消息的收发,支持消息的确认(Confirm)与返回(Return)。封 装 了 创 建 连 接 、 创 建 消 息 信 道 、 收 发 消 息 、 消 息 格 式 转 换、关闭信道、关闭连接等等操作。针对于多个服务器连接,可以定义多个 Template。可以注入到任何需要收发消息的地方使用。

 5.Messager Listener 消息侦听

MessageListener 是 Spring AMQP 异步消息投递的监听器接口,它只有一个方法onMessage,用于处理消息队列推送来的消息

MessageListenerContainer可以理解为MessageListener的容器,一个Container只有一个 Listener,但是可以生成多个线程使用相同的 MessageListener 同时消费消息。Container 可以管理 Listener 的生命周期,可以用于对于消费者进行配置。例如:动态添加移除队列、对消费者进行设置,例如 ConsumerTag、Arguments、并发、消费者数量、消息确认模式等等。

@Bean
public SimpleMessageListenerContainer messageContainer(ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(connectionFactory);
container.setQueues(getSecondQueue(), getThirdQueue()); //监听的队列
container.setConcurrentConsumers(1); // 最小消费者数
container.setMaxConcurrentConsumers(5); // 最大的消费者数量
container.setDefaultRequeueRejected(false); //是否重回队列
container.setAcknowledgeMode(AcknowledgeMode.AUTO); //签收模式
container.setExposeListenerChannel(true);
container.setConsumerTagStrategy(new ConsumerTagStrategy() { //消费端的标签策略
@Override
public String createConsumerTag(String queue) {
return queue + "_" + UUID.randomUUID().toString();
}
});
return container;
}

 6. 转换器 Message Convertor

 RabbitMQ 的消息在网络传输中需要转换成 byte[](字节数组)进行发送,消费者需要对字节数组进行解析。在 Spring AMQP 中,消息会被封装为 Message对象。消息的序列化和反序列化,就是处理 Message 的消息体 body 对象。如果消息已经是 byte[]格式,就不需要转换。如果是 String,会转换成 byte[]。如果是 Java 对象,会使用 JDK 序列化将对象转换为 byte[](体积大,效率差)。在 调 用 RabbitTemplate 的 convertAndSend() 方 法 发 送 消 息 时 , 会 使 用MessageConvertor 进行消息的序列化,默认使用 SimpleMessageConverter。在某些情况下,我们需要选择其他的高效的序列化工具。如果我们不想在每次发送消息时自己处理消息,就可以直接定义一个 MessageConvertor。

@Bean
public RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {
final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return rabbitTemplate;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章