Spring Boot RabbitMQ快速入门 (2)
Prefetch设置
当我们进入RabbitMQ的GUI管理界面, 点入某个队列查看消费者的属性时, 有记录如下
Channel | Consumer tag | Ack required | Exclusive | Prefetch count | Arguments |
---|---|---|---|---|---|
172.22.0.1:57382 (1) | amq.ctag-Gsix2DEjaFI9zVlsJJZp3Q | ● | ○ | 1 | |
172.22.0.1:57378 (1) | amq.ctag-_FIcIOpflMXXaBQN7xLYcA | ● | ○ | 1 |
上面的表格说明消息的消费需要手工ack, 且是公平分发的. 设置prefetch的方式有两种
全局式设定
在application.yml文件中设定
spring.rabbitmq.listener.prefetch
即可, 这会影响到本Spring Boot应用中所有使用默认SimpleRabbitListenerContainerFactory
的消费者spring: rabbitmq: host: localhost username: chris password: 123123 virtual-host: prontera listener: prefetch: 100
特定消费者设置
在消费者的配置中自定义一个
SimpleRabbitListenerContainerFactory
@Bean public SimpleRabbitListenerContainerFactory myContainerFactory( SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); factory.setPrefetchCount(100); configurer.configure(factory, connectionFactory); return factory; }
然后在消费者上声明使用该ContainerFactory即可达到对特定消费者配置prefetch的作用
@RabbitListener(queues = "#{rabbitConfiguration.TOPIC_QUEUE}", containerFactory = "myContainerFactory") public void processBootTask2(WorkUnit content) { System.out.println(content); }
Ack机制
Spring Boot Rabbit使用手工应答机制, 当@RabbitListener修饰的方法被调用且没有抛出异常时, Spring Boot会为我们自动应答. 否则会根据设定的重试机制而作出nack或reject等行为.
重试机制
重试分两种, template的重试与listener的重试, 分别代表生产者与消费者
生产者端的重试
spring:
rabbitmq:
template:
retry:
enabled: true
通过以上配置可以启动AmqpTemplate
的重试机制, 例如与RabbitMQ连接丢失的时候将会自动重试事件的发布, 这个特性默认是关闭的
消费者端的重试
消费者一端, 即@RabbitListener
也有像AmqpTemplate
一样的重试机制, 当重试次数(默认是3)耗尽的时候, 该特性同样也是默认关闭的, 可以通过以下配置打开
spring:
rabbitmq:
host: localhost
username: chris
password: 123123
virtual-host: prontera
listener:
retry:
enabled: true
如果消费一端的重试机制没有被启动, 而且Listener抛出异常的