【发布时间】:2020-01-13 23:18:29
【问题描述】:
我有一个使用 RabbitMQ (spring-boot-starter-amqp) 的 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?在多个类中定义队列
【问题讨论】:
标签: java spring rabbitmq message-queue spring-amqp