32.2.3 接收消息

当Rabbit设施出现时,所有bean都可以注解@RabbitListener来创建一个监听器端点。如果没有定义RabbitListenerContainerFactory,Spring Boot将自动配置一个默认的。如果定义MessageConverter beans,它将自动关联到默认的factory。

下面的组件创建一个someQueue队列上的监听器端点:

  1. @Component
  2. public class MyBean {
  3. @RabbitListener(queues = "someQueue")
  4. public void processMessage(String content) {
  5. // ...
  6. }
  7. }

具体参考@EnableRabbit

如果需要创建多个RabbitListenerContainerFactory实例,或想覆盖默认实例,你可以使用Spring Boot提供的SimpleRabbitListenerContainerFactoryConfigurer,通过它可以使用跟自动配置实例相同的配置初始化SimpleRabbitListenerContainerFactory

例如,下面使用一个特殊的MessageConverter创建了另一个factory:

  1. @Configuration
  2. static class RabbitConfiguration {
  3. @Bean
  4. public SimpleRabbitListenerContainerFactory myFactory(
  5. SimpleRabbitListenerContainerFactoryConfigurer configurer) {
  6. SimpleRabbitListenerContainerFactory factory =
  7. new SimpleRabbitListenerContainerFactory();
  8. configurer.configure(factory, connectionFactory);
  9. factory.setMessageConverter(myMessageConverter());
  10. return factory;
  11. }
  12. }

然后,你可以像下面那样在所有@RabbitListener注解方法中使用:

  1. @Component
  2. public class MyBean {
  3. @RabbitListener(queues = "someQueue", containerFactory="myFactory")
  4. public void processMessage(String content) {
  5. // ...
  6. }
  7. }

你可以启动重试处理那些监听器抛出异常的情况,当重试次数达到限制时,该消息将被拒绝,要不被丢弃,要不路由到一个dead-letter交换器,如果broker这样配置的话,默认禁用重试。

重要 如果没启用重试,且监听器抛出异常,则Rabbit会不定期进行重试。你可以采用两种方式修改该行为:设置defaultRequeueRejected属性为false,这样就不会重试;或抛出一个AmqpRejectAndDontRequeueException异常表示该消息应该被拒绝,这是开启重试,且达到最大重试次数时使用的策略。