我试图在代理失败的情况下关闭整个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可能是要走的路。但还没试过。
非常感谢你的支持。
答案 0 :(得分:0)
说实话,你的担忧是绝对不清楚的。正在进行fields: [
...,
{ key: 'desc', label: 'Description', tmpl: Template.field_description }
...,
];
,clearConnectionListeners
和destroy
,当兔子经纪人回来时,你的组件将会变得无用且无用。
您所需要的只是shutdown
所有侦听器容器,因为只有他们主动尝试连接到代理以获取新消息。
请确保您确实停止了应用程序中的所有监听器容器。当然,不要停止stop()
。当Broker回来时你将无法恢复。
看起来与您的问题完全相关:spring amqp rabbit max consumer connection retries