Rabbitmq 使用多个rabbit侦听器注释。只有一个在注册。其他抛出异常
我创建了两个队列配置,每个都有自己的@RabbitListener注释方法Rabbitmq 使用多个rabbit侦听器注释。只有一个在注册。其他抛出异常,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,我创建了两个队列配置,每个都有自己的@RabbitListener注释方法 @Configuration @EnableRabbit public class TestQueue extends QueueConfiguration { public String getQueueName() { return "testQueue"; } public String getRoutingKey() { return "testKey"; } @RabbitListener(q
@Configuration
@EnableRabbit
public class TestQueue extends QueueConfiguration {
public String getQueueName() {
return "testQueue";
}
public String getRoutingKey() {
return "testKey";
}
@RabbitListener(queues = "testQueue")
public void receive(Message message) { ... }
}
另一个队列配置
@Configuration
@EnableRabbit
public class AnotherTestQueue extends QueueConfiguration {
public String getQueueName() {
return "anotherTestQueue";
}
public String getRoutingKey() {
return "anotherTestKey";
}
@RabbitListener(queues = "anotherTestQueue")
public void receive(Message message) { ... }
}
以下是我创建队列、交换和绑定的基本队列配置:
public abstract class QueueConfiguration {
@Bean
public Queue mainQueue() {
return new Queue(getQueueName());
}
@Bean
public DirectExchange mainExchange() {
return new DirectExchange("main.exchange");
}
@Bean
public Binding mainExchangeBinding() {
return BindingBuilder.build(mainQueue()).to(mainExchange()).with(getRoutingKey());
}
// getQueueName() and getRoutingKey() are abstract methods
}
现在是公共配置类
@Configuration
public class CommonConfiguration {
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory,
WfmMessageListener listener) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(new Jackson2JsonMessageConverter());
factory.setAdviceChain(listener);
return factory;
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
return rabbitTemplate;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
return new RabbitAdmin(connectionFactory);
}
}
启动应用程序时,出现以下错误:
原因:com.rabbitmq.client.ShutdownSignalException:通道错误;协议方法:methodreply code=404,reply text=NOT_FOUND-vhost'/'中没有队列'testQueue',类id=50,方法id=10
在com.rabbitmq.client.impl.ChannelN.asyncShutdownChannelN.java:505~[amqp-client-4.0.3.jar:4.0.3]
在com.rabbitmq.client.impl.ChannelN.processAsyncChannelN.java:336~[amqp-client-4.0.3.jar:4.0.3]
在com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommandAMQChannel.java:143~[amqp-client-4.0.3.jar:4.0.3]
在com.rabbitmq.client.impl.AMQChannel.handleFrameAMQChannel.java:90~[amqp-client-4.0.3.jar:4.0.3]
在com.rabbitmq.client.impl.AMQConnection.readFrameAMQConnection.java:634~[amqp-client-4.0.3.jar:4.0.3]
在com.rabbitmq.client.impl.AMQConnection.access$300AMQConnection.java:47~[amqp-client-4.0.3.jar:4.0.3]
在com.rabbitmq.client.impl.AMQConnection$MainLoop.runAMQConnection.java:572~[amqp-client-4.0.3.jar:4.0.3]
我只尝试了一个队列配置,效果很好!
当我有多个兔子侦听器时,它抛出了这个错误。请提供帮助。公共抽象类队列配置
@Configuration
@EnableRabbit
public class AnotherTestQueue extends QueueConfiguration {
public String getQueueName() {
return "anotherTestQueue";
}
public String getRoutingKey() {
return "anotherTestKey";
}
@RabbitListener(queues = "anotherTestQueue")
public void receive(Message message) { ... }
}
队列定义@Beans必须具有唯一的bean名称。默认情况下,bean名称是方法名称;由于您的配置类都是QueueConfiguration子类,因此最终将得到一个名为mainQueue的@Bean。第一个定义被第二个定义覆盖
您需要将@Bean移动到子类中,并为它们指定唯一的Bean名称
公共抽象队列;
@凌驾
@豆蔻豆蔻
公共队列主队列{
返回新的QueuegetQueueName;
}
@凌驾
@beansometherbeanname
公共队列主队列{
返回新的QueuegetQueueName;
}
完美的谢谢@Gary的快速回复!谢谢。你能告诉我一个有效的方法吗?我希望避免在每个队列配置类中定义bean。我排了50多个队。你真的应该问一个新问题;他们不喜欢这里的长篇大论。您可以使用包含相同队列列表的@Beans声明多个队列/绑定。看见如果您的侦听器都具有相同的签名,则不需要每个队列都有一个签名。