如果经纪人崩溃,spring amqp会停止消费者线程

时间:2017-02-22 15:58:04

标签: spring-amqp

我试图在代理失败的情况下关闭整个amqp设置而不关闭上下文/应用程序。我已经从Listener中尝试了以下内容,其中我捕获了与代理失败的连接错误相关的事件,

 connectionFactory.clearConnectionListeners();
 connectionFactory.stop();
 connectionFactory.destroy();
 myContainer.stop();  
 myContainer.shutdown();

但是,我一直在重新尝试连接,

org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connect
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:62)
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:309)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:547)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1387)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1368)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1344)
at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:335)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.redeclareElementsIfNecessary(SimpleMessageListenerContainer.java:1102)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:95)
at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1278)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)

查看CachingConnectionFactory,我看到了,

/**
 * Stop the connection factory to prevent its connection from being used.
 * Note: ignored unless the application context is in the process of being stopped.
 */
@Override
public void stop() {
    if (this.contextStopped) {
        this.running = false;
        this.stopped = true;
        this.deferredCloseExecutor.shutdownNow();
    }
    else {
        logger.warn("stop() is ignored unless the application context is being stopped");
    }
}

当我尝试停止connectionFactory时,我在日志中看到的是

WARN --- [onsumerThread_8] o.s.a.r.c.CachingConnectionFactory : stop() is ignored unless the application context is being stopped

这是什么意思,我必须关闭应用程序?如果没有从消费者线程到代理的无休止连接尝试,应用程序是否无法继续运行?

感谢

修改

好的,EventListener按预期工作,我可以关闭listenerContainers,应用程序继续正常工作。 但这种方法在启动时咬我。 这在应用程序运行时工作正常,然后我关闭了代理。但是应用程序无法启动,因为在接收失败的启动时,EventListener关闭容器并且应用程序上下文拒绝加载。 这有意义吗?

如何实现这两个目标 - 1.在启动时,2。在运行期间,让应用程序承受经纪人的损失。

EDIT 根据@garyrussel和@artembilan的建议,捕获失败事件的方法可以在运行时避免代理失败。只是关闭MessageListenerContainer似乎停止了消费者重新连接尝试。事件监听器使我能够更新全局变量,以将代理的故障传达给系统中的其他模块。这很重要,因为只使用rabbitTemplate的制作人仍然会失败。使用这个全局布尔变量,我可以有条件地进行发送。 它还为我们提供了将来添加REST端点以重新启动ListenerContainers的选项,只需在bean上调用start即可。 我还没有解决RabbitMQ的启动时失败问题。似乎有一个@Lazy加载ListenerContainer和ConnectionFactory可能是要走的路。但还没试过。 非常感谢你的支持。

1 个答案:

答案 0 :(得分:0)

说实话,你的担忧是绝对不清楚的。正在进行fields: [ ..., { key: 'desc', label: 'Description', tmpl: Template.field_description } ..., ]; clearConnectionListenersdestroy,当兔子经纪人回来时,你的组件将会变得无用且无用。

您所需要的只是shutdown所有侦听器容器,因为只有他们主动尝试连接到代理以获取新消息。

请确保您确实停止了应用程序中的所有监听器容器。当然,不要停止stop()。当Broker回来时你将无法恢复。

看起来与您的问题完全相关:spring amqp rabbit max consumer connection retries