Java 如何在多个类中使用@RabbitListener?

Java 如何在多个类中使用@RabbitListener?,java,spring,rabbitmq,message-queue,spring-amqp,Java,Spring,Rabbitmq,Message Queue,Spring Amqp,我有一个使用RabbitMQ(springbootstarteramqp)的Spring应用程序 我想知道是否可以跨不同的类使用@RabbitListener注释 我目前有两个类:Receiver和DeadLetterQueue Receiver.java: @Component @Slf4j public class Receiver { private final Logger logger = LoggerFactory.getLogger(this.getClass());

我有一个使用RabbitMQ(springbootstarteramqp)的Spring应用程序

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

我目前有两个类:
Receiver
DeadLetterQueue

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");
  }
@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());
    }
}
@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);
  }
RabbitMqConfig.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");
  }
@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());
    }
}
@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在多个类中定义队列?

是的,您可以在同一个类或多个类中拥有任意多个
@RabbitListener
,只要这些类在Springbean中使用即可

由于这两个组件上都有
@组件
,它应该可以正常工作,除非
死信队列
位于Spring Boot未扫描的包中

Boot只查看主
@springbootplication
所在的包和子包

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

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

经纪人的位置无关紧要