当前位置: 首页 > 知识库问答 >
问题:

启动bean失败org.springframework.amqp.rabbit.config.internalRabbitListenerEndpoint注册

饶高雅
2023-03-14

我有一个简单的spring启动应用程序,其中有一个兔子发送器和一个接收器。我想编写一些接收器测试,其中我以Junit类规则(RabbitContainerRule)运行rabbitmq docker实例,然后使用rabbitTemplate发送消息,测试验证接收器是否接收到相同的消息。但我得到了以下例外:

Caused by: org.springframework.context.ApplicationContextException: Failed to start bean 'org.springframework.amqp.rabbit.config.internalRabbitListenerEndpointRegistry'; nested exception is org.springframework.amqp.AmqpIllegalStateException: Fatal exception on listener startup
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)

Caused by: org.springframework.amqp.rabbit.listener.QueuesNotAvailableException: Cannot prepare queue for listener. Either the queue doesn't exist or the broker will not allow us to use it.
    at org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:599)
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1424)

Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue 'my-message-queue' in vhost '/', class-id=50, method-id=10)
    at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)

如果使用管理控制台在docker实例中手动创建队列(通过在断点处停止),则测试通过。

另外,如果我使用docker rabbit实例手动测试它,我的Spring Boot应用程序将成功创建队列。那么,是什么导致它不能在测试中创建呢?

我使用的是SpringAMQP1.7.4版本

接收器代码:

@RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "my-message-queue", durable = "true",
                arguments = {
                        @Argument(name = "x-dead-letter-exchange", value = "my-message-exchange-dead-letter"),
                        @Argument(name = "x-dead-letter-routing-key", value = "my-message-queue")}),
        exchange = @Exchange(value = "my-message-exchange", type = "topic", durable = "true"),
        key = "my-message-rk")
)
public void handleMessage(MyMessage message) {
    MESSAGE_LOG.info("Receiving message: " + message);
}

此外,我不会在配置中为我的消息队列创建任何@Bean,并依靠@RabbitListener为我创建一个。但是我正在我的配置中创建ConnectionFactory、RabbitTemboard和SimpleRabbitListenerContainerFactory bean。

共有2个答案

晏沈义
2023-03-14

构建队列的类应该使用@configurationannotation进行注释,否则spring将无法在启动时创建队列

单凯捷
2023-03-14

在某些@Configuration类中,@enablebrabbit是必需的,以允许应用程序上下文解析@RabbitListener

为了让应用程序自动创建队列以及它们之间的交换和绑定,配置中必须存在RabbitAdminbean。

有关更多信息,请参阅参考手册:https://docs.spring.io/spring-amqp/docs/2.0.0.RELEASE/reference/html/

 类似资料:
  • 我试图把一个Spring启动应用程序放在一个docker容器内,但当我运行它时,我得到这个错误。我看到它是平木的应用程序属性 我在另一个出版物Spring Boot:未能配置数据源:未指定“url”属性,并且无法配置嵌入式数据源 这是我的天赋 泊坞窗文件

  • 从文件夹内部执行“npm start”命令时出现以下错误/ 我在互联网上尝试了多种解决方案,但都无效。

  • 我通过pgAdmin III与远程postgres-9.3连接。关闭pgAdmin后,我尝试在另一天与同一数据库连接。 在pgstartup.log文件中,我有: pg_hba.conf: 服务器上的操作系统是CentOS。不幸的是,我不知道postgres是如何安装在服务器上的,因为有人这样做了。我能用这个做什么?

  • 当前的java版本是

  • 启动Tomcat失败,请检查C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.27\bin\catalina。bat和相关脚本是可执行的。 一直有这个问题在netbean。如何解决问题?请帮忙。

  • 我下载了Scene Builder,试图打开一个.fxml文件,但出现了以下错误消息: 启动SceneBuilder失败。错误消息是:无法运行程序“C:\program Files(x86)\Oracle\JavaFX Scene Builder 2.0”:CreateProcess error=5,Acces被拒绝