java如何在多个类中使用@RabbitListener?
我有一个使用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");
}
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?
在多个类中定义队列吗
# 1 楼答案
是的,您可以在同一个类或多个类中拥有任意数量的
@RabbitListener
,只要这些类在Springbean中使用由于这两个版本都有
@Component
,所以它应该可以正常工作,除非DeadLetterQueue
位于Spring Boot未扫描的包中Boot只查看主
@SpringBootApplication
所在的包和子包您可以为
org.springframework
启用DEBUG
日志记录,以便在应用程序初始化期间记录所有bean的创建经纪人的位置无关紧要