【问题标题】:Automatic retry connection to broker by spring-rabbitmqspring-rabbitmq 自动重试连接代理
【发布时间】:2017-03-23 16:06:34
【问题描述】:

我已阅读此文档片段:

RabbitMQ 自动连接/拓扑恢复

自 Spring AMQP 的第一个版本以来,该框架已经提供了它的 在代理失败的情况下自己的连接和通道恢复。 此外,如第 3.1.10 节“配置代理”中所述, RabbitAdmin 将重新声明任何基础设施 bean(队列等) 重新建立连接。因此它不依赖于 现在由 amqp-client 库提供的自动恢复。春天 AMQP 现在使用 4.0.x 版本的 amqp-client,它具有自动 默认启用恢复。 Spring AMQP 仍然可以使用自己的 如果您愿意,可以在客户端禁用恢复机制,(通过 在基础上设置 automaticRecoveryEnabled 属性 RabbitMQ connectionFactory 为 false)。然而,框架是 与启用的自动恢复完全兼容。这意味着任何 您在代码中创建的消费者(可能通过 RabbitTemplate.execute()) 可以自动恢复。

我不确定我是否正确理解。在我的application.properties 中,我定义了端口和主机。在启动我的 spring-boot 应用程序期间,它成功建立了连接以及与队列通信的所有必要 bean。

但是,如果在启动过程中我的应用程序代理关闭并且它将在应用程序启动五分钟后启动,该怎么办? spring-rabbitmq 是否设法重新连接并定义所有 bean?

【问题讨论】:

    标签: java spring-boot spring-integration spring-amqp spring-rabbit


    【解决方案1】:

    没错。 Spring AMQP 自动管理重新连接和恢复。

    本主题与 bean 定义无关。如果您谈论 Broker 实体声明,那么是的,它们确实在建立连接时进行处理。

    【讨论】:

    • 重连成功后,简单的语言监听器就能收到消息了?
    • 类似的东西。也请看这里:docs.spring.io/spring-amqp/reference/html/…
    • 好的,谢谢。我会读到它。明天我会在实践中检查它,如果有问题我会给你一个标志!除了阅读这篇参考资料之外,我认为我应该大致阅读spring-rabbitmq 的代码
    • 还有一件事:在我明天检查之前,您是否完全了解我的用例?在属性中,我有主机和端口。如果代理关闭,那么在启动/启动/mvn spring-boot:run spring-boot 应用程序 - 它应该启动还是抛出异常并关闭?
    • github.com/spring-projects/spring-amqp-samples。您可以在其中一个上使用启动/停止 RabbitMQ。
    【解决方案2】:

    我也遇到过类似的问题,您只需在连接工厂配置中添加一个属性即可。

    根据文章here在工厂设置factory.setAutomaticRecoveryEnabled(true);factory.setNetworkRecoveryInterval(10000);,当rabbit服务器宕机或连接丢失时,rabbit客户端会尝试重新连接。

    因为您使用的是连接工厂的弹簧配置,所以您的连接工厂将如下所示

    <bean id="connectionFactory"
          class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
        <constructor-arg value="somehost"/>
        <property name="username" value="guest"/>
        <property name="password" value="guest"/>
        <property name="automaticRecoveryEnabled" value="true"/>
        <property name="networkRecoveryInterval" value="100000"/>
    </bean>
    

    连接工厂参考here

    【讨论】:

    • 好的,可以从application.properties配置吗??
    • @HaskellFun 绝对。 Spring 获取系统属性以及应用程序的属性,因此,您可以使用它来代替上面示例中的 10000。
    • 我不确定我是否可以从这个文件配置它:docs.spring.io/spring-boot/docs/current/reference/html/… 但是,我可以处理 JavaConfig。如果您的配置符合我的期望,请告诉我:启动期间 spring-boot app 我们可以在日志中看到没有连接,5分钟后(5分钟后broker就死了)它建立连接并向Listener发送消息。
    • @HaskellFun 您是否尝试在 Spring Boot 应用程序启动后关闭代理?我提到的属性在启动应用程序部署后关闭代理时有效。
    • 小错误:类名必须是com.rabbitmq.client.ConnectionFactory,因为这个类有属性automaticRecoveryEnablednetworkRecoveryInterval。这是驱动连接工厂。而且这个工厂实例需要作为构造函数arg传递给spring的CachingConnectionFactory
    【解决方案3】:

    是的,当代理重新上线时,将重新创建连接。默认恢复间隔为 5 秒。您可以通过设置container.setRecoveryInterval(30000); 更改恢复间隔,其中containerSimpleMessageListenerContainer。在底层连接工厂cachingConnectionFactory.getRabbitConnectionFactory().setNetworkRecoveryInterval(int) 中设置恢复间隔似乎没有反映。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      相关资源
      最近更新 更多