【问题标题】:How can I use @RabbitListener in multiple classes?如何在多个类中使用@RabbitListener?
【发布时间】:2020-01-13 23:18:29
【问题描述】:

我有一个使用 RabbitMQ (spring-boot-starter-amqp) 的 Spring 应用程序。

我想知道是否可以在不同的类中使用 @RabbitListener 注释。

我目前有两个班级:ReceiverDeadLetterQueue

Receiver.java:

@Component
@Slf4j
public class Receiver {

  private final Logger logger = LoggerFactory.getLogger(this.getClass());

  @RabbitListener(queues = "queueName")
  public void receiveMessage(String message) throws Exception {
    logger.info("Received <{}>" + message.toString());

    throw new Exception("Error with the message");
  }

DeadLetterQueue.java:

@Component
@Slf4j
public class DeadLetterQueue {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @RabbitListener(queues = "otherQueueName")
    public void processFailedMessages(String message) {
        logger.info("Received failed message<{}>:" + message.toString());
    }
}

RabbitMqConfig.java:

@Data
@Configuration
@ConfigurationProperties(prefix = "rabbitmq")
public class RabbitMqConfig {

  private String host;
  private int port;
  private String username;
  private String password;
  private String queue;
  private String exchange;
  private String dlq;
  private String dlx;
  private String routingKey;

  @Bean
  Queue incomingQueue() {
    return QueueBuilder.durable(queue)
            .withArgument("x-dead-letter-exchange", dlx)
            .build();
  }

  @Bean
  FanoutExchange deadLetterExchange() {
    return new FanoutExchange(dlx);
  }

  @Bean
  Queue deadLetterQueue() {
    return QueueBuilder.durable(dlq).build();
  }

  @Bean
  Binding deadLetterBinding() {
    return BindingBuilder.bind(deadLetterQueue()).to(deadLetterExchange());
  }

  @Bean
  DirectExchange incomingQueueExchange() {
    return new DirectExchange(exchange);
  }

  @Bean
  Binding incomingQueueBinding() {
    return BindingBuilder.bind(incomingQueue()).to(incomingQueueExchange()).with(queue);
  }

当我使用 RabbitMQ 管理工具向 FanoutExchange 发布消息时,DeadLetterQueue 类中的 processFailedMessages 不会向控制台记录任何内容。但是,如果此方法在 Receiver 类中,则一切正常。这导致我假设@RabbitListener 不能跨多个类工作,除非我缺少一些配置。

其他信息:

  • 我正在使用 Docker 运行 RabbitMQ 服务器
  • 奇怪的是,如果我将 receiveMessage() 方法放在 DeadLetterQueue 类中,预期会失败。

所以:是否可以使用@RabbitListener?在多个类中定义队列

【问题讨论】:

    标签: java spring rabbitmq message-queue spring-amqp


    【解决方案1】:

    是的,您可以在同一个类或多个类中拥有任意数量的@RabbitListeners,只要这些类在 Spring bean 中使用即可。

    由于您在两者上都有 @Component,它应该可以正常工作,除非 DeadLetterQueue 位于 Spring Boot 未扫描的包中。

    引导只查看主@SpringBootApplication所在的包和子包。

    您可以为org.springframework 启用DEBUG 日志记录,以记录应用程序初始化期间的所有bean 创建。

    我正在使用 Docker 运行 RabbitMQ 服务器

    经纪人的位置无关紧要。

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多