重新创建队列并重新连接到rabbitMQ

时间:2018-03-27 17:10:25

标签: spring-amqp

涉及的组件:Spring Config-server,Spring AMQP(RabbitMQ),Spring Config-client

目标:使用推送通知通知config-client刷新配置。

  • RabbitMQ实例:从docker hub,我取出rabbitmq:3-management图像并运行。
  • 配置客户端AMQP版本pom.xml:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        <version>1.3.1.RELEASE</version>
    </dependency>
    
  • 配置服务器pom.xml:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-config-monitor</artifactId>
        <version>1.3.1.RELEASE</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        <version>1.2.1.RELEASE</version>
    </dependency>
    

容错情景: - 打开RabbitMQ服务/集群/实例。 - 所有配置客户端都失去连接。队列被删除,因为它们被创建为自动删除。 - 恢复RabbitMQ服务。

  • 期望:所有配置客户端都应重新成功连接。

  • 现实:这不起作用。请参阅以下错误。

  

2018-03-27 09:07:12.850 WARN 21251 --- [AO2Q06fYCALSA-6] o.s.a.r.listener.BlockingQueueConsumer:无法申报队列:springCloudBus.anonymous.FGZPCPqzTAO2Q06fYCALSA   2018-03-27 09:07:12.851 ERROR 21251 --- [AO2Q06fYCALSA-6] o.s.a.r.l.SimpleMessageListenerContainer:消费者在启动时收到致命异常

     

org.springframework.amqp.rabbit.listener.QueuesNotAvailableException:无法为侦听器准备队列。队列不存在或者代理不允许我们使用它。       在org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:548)       在org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer $ AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1335)       在java.base / java.lang.Thread.run(Thread.java:844)   引起:org.springframework.amqp.rabbit.listener.BlockingQueueConsumer $ DeclarationException:无法声明队列:[springCloudBus.anonymous.FGZPCPqzTAO2Q06fYCALSA]       在org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:621)       在org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:520)   [省略共同框架]   引起:java.io.IOException:null

     

引起:com.rabbitmq.client.ShutdownSignalException:通道错误;协议方法:#method(reply-code = 404,reply-text = NOT_FOUND - no queue&#39; springCloudBus.anonymous.FGZPCPqzTAO2Q06fYCALSA&#39; in vhost&#39; /&#39;,class-id = 50,方法-ID = 10)

     

[常见框架省略]   引起:com.rabbitmq.client.ShutdownSignalException:通道错误;协议方法:#method(reply-code = 404,reply-text = NOT_FOUND - no queue&#39; springCloudBus.anonymous.FGZPCPqzTAO2Q06fYCALSA&#39; in vhost&#39; /&#39;,class-id = 50,方法-ID = 10)       在com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:505)

     

[常见框架省略]

     

2018-03-27 09:07:12.852 ERROR 21251 --- [AO2Q06fYCALSA-6] o.s.a.r.l.SimpleMessageListenerContainer:从流产消费者处停止容器   2018-03-27 09:07:12.853 INFO 21251 --- [AO2Q06fYCALSA-6] o.s.a.r.l.SimpleMessageListenerContainer:等待工人完成。   2018-03-27 09:07:12.853 INFO 21251 --- [AO2Q06fYCALSA-6] o.s.a.r.l.SimpleMessageListenerContainer:成功等待工人完成。

  • 我理解的错误描述 配置客户端使用现有代理,侦听器尝试重新连接但缺少队列。默认情况下进行3次重试。这是预期的,因为我们正在经历Rabbit MQ服务关闭并重新启动而没有持久数据的情况。问题是重新连接失败。我从许多文章中得知,我们提到我们不能在不使用admin的情况下重新排队。为此,我们创建了一个XML配置文件,用于创建声明管理员和其他内容的属性bean。

问题是什么? - 如果在默认情况下将所有这些都注意到,那么它是否理想。 **我还是没有工作解决方案。需要帮助&#34;

1 个答案:

答案 0 :(得分:0)

我刚用Boot 2.0和Finchley.M9(总线2.0.0.M7)测试它没有问题...

  

2018-03-27 13:25:06.125 INFO 36716 --- [main] c.s.b.r.p.RabbitExchangeQueueProvisioner:声明入站队列:springCloudBus.anonymous.tySvAS8BSpS7OtQ_VCeiVQ,绑定到:springCloudBus

     

...

     

2018-03-27 13:26:38.220 ERROR 36716 --- [127.0.0.1:5672] o.s.a.r.c.CachingConnectionFactory:频道关闭:连接错误;协议方法:#method(reply-code = 320,reply-text = CONNECTION_FORCED - 代理强制连接关闭,原因'shutdown',class-id = 0,method-id = 0)

     

2018-03-27 13:26:58.757 INFO 36716 --- [pS7OtQ_VCeiVQ-6] o.s.a.r.c.CachingConnectionFactory:试图连接到:[localhost:5672]

     

2018-03-27 13:26:58.761 INFO 36716 --- [pS7OtQ_VCeiVQ-6] osarcCachingConnectionFactory:创建新连接:rabbitConnectionFactory#52c8295b:5 / SimpleConnection @ 74846ead [delegate = amqp://guest@127.0。 0.1:5672 /,localPort = 49746]

     

2018-03-27 13:26:58.762 INFO 36716 --- [pS7OtQ_VCeiVQ-6] osamqp.rabbit.core.RabbitAdmin:自动声明非持久,自动删除或独占队列(springCloudBus。 anonymous.tySvAS8BSpS7OtQ_VCeiVQ)久包:false,自动删除:true,exclusive:true。如果代理停止并在连接工厂处于活动状态时重新启动,它将被重新声明,但所有消息都将丢失。

RabbitExchangeQueueProvisioner显式设置RabbitAdmin以在重新建立连接后重新声明队列。

我现在会试用旧版本......

修改

与boot 1.5.10和Edgware.SR3(总线1.3.3.RELEASE)相同的结果。

<强> EDIT2

与1.3.1总线启动器相同的结果(引入1.2.1流兔子)。工作正常。