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

Spring Rabbit-如何为非bean的声明(队列/绑定/交换)恢复Rabbit拓扑(当Rabbit服务器重新启动时)

严兴言
2023-03-14

我将Spring Boot应用程序与sping-Rabbit(版本2.2.2)一起使用。由于我的应用程序的本质是非常动态的,因此队列和绑定是使用RabbitAdmin.declareXXX方法动态声明的,因此它们不会声明为Spring Beans。

根据我的理解(和测试),RabbitAdmin的自动恢复拓扑的功能在Rabbitmq服务器重启时仅适用于声明为Spring Beans的交换/队列/绑定(我说得对吗?)。

我尝试使用以下方法使用底层Rabbit客户端的自动恢复功能:

cachingConnectionFactory.getRabbitConnectionFactory().setAutomaticRecoveryEnabled(true)
cachingConnectionFactory.getRabbitConnectionFactory().setTopologyRecoveryEnabled(true)

但是,在rabbitmq服务器重新启动后,spring应用程序会出现以下故障:

  1. 一个<代码>组织。springframework。amqp。兔子联系自动恢复连接NotCurrentlyOpenException
  2. 和多个连续的com。rabbitmq。客户关机信号异常:通道错误;协议方法:#方法

什么都没有恢复。

请注意,在没有Spring的测试中,队列是直接通过通道创建的,队列会与其消费者一起正确恢复。

还有什么我可以配置的,使这项工作?

共有1个答案

东郭自强
2023-03-14

目前,spring只恢复在应用程序上下文中定义为bean的声明文件。

基于您的用户名,我假设您打开了此功能请求:https://github.com/spring-projects/spring-amqp/issues/1365

如果人们遇到这个问题,请在此处发布此消息。

 类似资料:
  • 我正在使用 spring-cloud d-stream: 3.1.4 spring-cloud d-stream-binder-兔子:3.1.4 我在“属性”下的此处配置了一个消费者。我的问题是,当使用者在rabbitmq服务器可用之前启动时,我可以看到使用者会重新启动,直到连接可用为止。然而,DLX和DLQ之间创建的绑定并不相同。 如果消费者启动时Rabbitmq可用:DLQ绑定到DLX,路由密

  • 在我看来,javaconfiguration类或基于XML的配置中的声明都是静态的。我知道如何为队列、交换或绑定设置更动态的值(例如名称),如下所示: 但我想知道是否可以创建一个未定义数量的Queue实例,并将它们注册为bean,就像工厂注册它的所有实例一样。 我不太熟悉Spring@Bean注释及其局限性,但我尝试了

  • 然后我尝试启动微服务,但我得到以下错误:

  • 我有一个项目,我们将在rabbit中有数百个(可能数千个)队列,每个队列都需要一个消费者池来使用。 在rabbit(使用spring amqp)中,您有rabbitlistener注释,它允许我静态地分配这个特定消费者将处理的队列。 我的问题是,对于rabbit和spring,是否有一种干净的方法可以让我获取一段队列(比如以a-c开头的队列),然后还可以侦听消费者运行时创建的任何队列。 示例(开始

  • 我们试图在我们的Spring Boot应用程序中使用sping-Rabbit创建一个消息侦听器。但是,如果队列不存在,我们在接收消息期间会遇到问题,应用程序会抛出错误,称为被动声明。 我们想要的是主动声明队列,即如果队列不存在,则应该在mq中声明它。

  • 在我的应用程序中,我使用spring cloud stream集成Rabbit MQ。默认情况下,spring cloud streams将目标创建为Rabbit MQ中的交换类型主题。如何配置spring cloud stream以创建fanout类型的交换?