Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rabbitmq 使用多个rabbit侦听器注释。只有一个在注册。其他抛出异常_Rabbitmq_Spring Amqp_Spring Rabbit - Fatal编程技术网

Rabbitmq 使用多个rabbit侦听器注释。只有一个在注册。其他抛出异常

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

我创建了两个队列配置,每个都有自己的@RabbitListener注释方法

@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声明多个队列/绑定。看见如果您的侦听器都具有相同的签名,则不需要每个队列都有一个签名。