当前位置: 首页 > 知识库问答 >
问题:

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

子车高超
2023-03-14

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

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

我目前有两个类:ReceiverDeadLetterQueue

<代码>接收器。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类中的Process FailedMessages不会将任何内容记录到控制台。但是,如果此方法在Recencer类中,则一切正常。这让我假设@RabbitListener无法跨多个类工作,除非我缺少一些配置。

其他信息:

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

那么:是否可以使用RabbitListener在多个类中定义队列

共有1个答案

莘绍元
2023-03-14

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

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

Boot只查看main@SpringBootApplication所在的包和子包。

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

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

经纪人的位置无关紧要。

 类似资料:
  • 问题内容: 我目前正在用Java编写一个大型项目,其中包含许多类,有些类很小,只用很少的方法表示对象。我的主班有一个记录器,它运行良好。我希望所有类只能使用一个记录器(带有一个控制台附加程序)。我试图将对记录器的引用传递给不同的类,但是看起来不正确。此外,有时我在不运行main的情况下在类上运行测试,因此未针对其他类初始化记录器。 我的意思是,如何做到这一点的最佳方法是如何从不同的类登录到一个日志

  • 问题内容: 使用css-in-js方法将类添加到React组件,如何添加多个组件? 这是class变量: 这是我的用法: 上面的作品,但有没有办法添加两个类,而无需使用npm包?就像是: 问题答案: 您可以使用字符串插值:

  • 问题内容: 所以我正在一个项目中,我想要一个包含多个数据流的列表视图。我正在寻找的是这样的东西,但是所有这些都需要在一个列表视图中滚动。 我正在接收的数据流来自firebase,并且该变量是firebase集合的实例。我能够为单个流构建一个列表,所以我知道实例是正确的,我不想共享它,因为当前数据库规则处于测试模式。 此代码使我可以从单个流构建单个对象,并且可以按预期工作。 从这里开始,我觉得我有2

  • 但我得到了NullPointerException任何人都可以帮忙

  • 问题内容: 我有几个模块-假设是server.js,module1.js,…,moduleN.js。 我想在server.js中定义日志文件: 然后在我所有的模块中使用它 最好的方法是什么?我可以在每个模块中,然后在server.js中进行设置,但是还有更好的解决方案吗? 先感谢您! 问题答案: 默认的记录器概念很好地解决了这一问题。 Winston定义了一个默认记录器,任何对Winston的直接

  • 我有一个负载平衡器,我想测试负载平衡器的性能。我使用Apache JMeter来测试负载平衡器。我需要更改我的IP地址,以便客户端IP总是不同的。我的uni不允许我添加多个IP地址(IP欺骗/ IP别名)。 所以,另一个选择是使用代理服务器。有没有办法一次在JMeter中使用2个或多个代理服务器?目前我只能一次指定一个代理服务器。 有办法扭转局面吗?