Spring 引导 RabbitMQ 侦听器创建重复队列
Spring boot RabbitMQ Listener Creating Duplicate Queue
我有两个独立的应用程序,一个用于生产者,一个用于交换类型为默认 (DIRECT) 的消费者。
下面是 Rabbit MQ Producer 的配置以及死信队列设置。
@Bean
Queue dlq() {
return QueueBuilder.durable(dlqQueueName).build();
}
@Bean
Queue queue() {
return QueueBuilder
.durable(queueName)
.withArgument("x-dead-letter-exchange", dlqExchange)
.withArgument("x-dead-letter-routing-key", deadLetterRoutingKey)
.withArgument("x-message-ttl",messageTTL)
.build();
}
@Bean
Binding binding() {
return BindingBuilder.bind(queue()).to(exchange()).with(routingkey);
}
@Bean
Binding dlqBinding() {
return BindingBuilder.bind(dlq()).to(deadLetterExchange()).with(deadLetterRoutingKey);
}
现在这是单独应用程序中 Rabbit MQ 侦听器 的代码。
@Component
public class RabbitMqConsumer implements MessageListener {
@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "${queuename}", durable = "true"),
exchange = @Exchange(value = "exchange"),key = "routingkey"))
public void message(MyClass o) {
//save to db
}
@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
}
现在,当我 运行 消费者服务时,它会创建一个具有相同名称的重复队列。如下图所示
Rabbit MQ GUI
我也在consumer中尝试了以下设置,但结果相同
@Bean
public Queue queue() {
return QueueBuilder
.durable(env.getProperty("queue"))
.ttl(ttl)
.deadLetterExchange(ddlE)
.deadLetterRoutingKey(env.getProperty("dle.routingkey"))
.build();
}
注意:当我在生产者中添加死信队列设置时,这个问题开始出现,在这个设置之前,我有这个(下面提到)bean
方法在消费者和生产者的配置 类 中,它工作正常。
@Bean
public Queue queue() {
return new Queue(queueName,true);
}
以上配置有什么问题吗?为什么它复制队列,我无法弄明白只是它们的功能不同
Spring-引导版本 : <version>2.5.2</version>
您还没有共享属性文件!
在 属性 文件中写入的队列名称末尾必须有一些隐藏字符或 spaces。
匹配消费者和生产者属性文件中的两个名称。应用程序之一(消费者或生产者)正在创建队列,其中 space 或隐藏字符作为队列名称的一部分!
我有两个独立的应用程序,一个用于生产者,一个用于交换类型为默认 (DIRECT) 的消费者。
下面是 Rabbit MQ Producer 的配置以及死信队列设置。
@Bean
Queue dlq() {
return QueueBuilder.durable(dlqQueueName).build();
}
@Bean
Queue queue() {
return QueueBuilder
.durable(queueName)
.withArgument("x-dead-letter-exchange", dlqExchange)
.withArgument("x-dead-letter-routing-key", deadLetterRoutingKey)
.withArgument("x-message-ttl",messageTTL)
.build();
}
@Bean
Binding binding() {
return BindingBuilder.bind(queue()).to(exchange()).with(routingkey);
}
@Bean
Binding dlqBinding() {
return BindingBuilder.bind(dlq()).to(deadLetterExchange()).with(deadLetterRoutingKey);
}
现在这是单独应用程序中 Rabbit MQ 侦听器 的代码。
@Component
public class RabbitMqConsumer implements MessageListener {
@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "${queuename}", durable = "true"),
exchange = @Exchange(value = "exchange"),key = "routingkey"))
public void message(MyClass o) {
//save to db
}
@Override
public void onMessage(Message message) {
// TODO Auto-generated method stub
}
现在,当我 运行 消费者服务时,它会创建一个具有相同名称的重复队列。如下图所示
Rabbit MQ GUI
我也在consumer中尝试了以下设置,但结果相同
@Bean
public Queue queue() {
return QueueBuilder
.durable(env.getProperty("queue"))
.ttl(ttl)
.deadLetterExchange(ddlE)
.deadLetterRoutingKey(env.getProperty("dle.routingkey"))
.build();
}
注意:当我在生产者中添加死信队列设置时,这个问题开始出现,在这个设置之前,我有这个(下面提到)bean
方法在消费者和生产者的配置 类 中,它工作正常。
@Bean
public Queue queue() {
return new Queue(queueName,true);
}
以上配置有什么问题吗?为什么它复制队列,我无法弄明白只是它们的功能不同
Spring-引导版本 : <version>2.5.2</version>
您还没有共享属性文件!
在 属性 文件中写入的队列名称末尾必须有一些隐藏字符或 spaces。
匹配消费者和生产者属性文件中的两个名称。应用程序之一(消费者或生产者)正在创建队列,其中 space 或隐藏字符作为队列名称的一部分!