AMQP代理与Spring AMQP/RabbitMQ断开/重新连接的通知

AMQP代理与Spring AMQP/RabbitMQ断开/重新连接的通知,spring,spring-amqp,spring-rabbit,Spring,Spring Amqp,Spring Rabbit,SpringAMQP的一个很好的特性是,它似乎实现了必要的逻辑,以便在代理关闭和恢复时将Spring应用程序重新连接到消息代理 我要寻找的是检测应用程序中何时发生此类断开/重新连接事件的首选方法 到目前为止,我想到的最好的方法是一种类似轮询的机制,在这种机制中,我尝试定期从连接工厂获取通道 提前谢谢 请随意打开一个“改进”-当连接丢失(并重新建立)时,我们可以发出一个ApplicationEvent;然后,您可以使用ApplicationListener订阅该事件 同时,您可以通过日志子系统执行

SpringAMQP的一个很好的特性是,它似乎实现了必要的逻辑,以便在代理关闭和恢复时将Spring应用程序重新连接到消息代理

我要寻找的是检测应用程序中何时发生此类断开/重新连接事件的首选方法

到目前为止,我想到的最好的方法是一种类似轮询的机制,在这种机制中,我尝试定期从连接工厂获取通道


提前谢谢

请随意打开一个“改进”-当连接丢失(并重新建立)时,我们可以发出一个
ApplicationEvent
;然后,您可以使用
ApplicationListener
订阅该事件

同时,您可以通过日志子系统执行一些操作—例如,使用Log4J,您可以创建一个自定义的appender,以使用
SimpleMessageListenerContainer
类别获取日志,例如

16:05:50.042 WARN  [SimpleAsyncTaskExecutor-6][org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer] Consumer raised exception, processing can restart if the connection factory supports it. Exception summary: com.rabbitmq.client.ShutdownSignalException: connection error; reason: {#method<connection.close>(reply-code=320, reply-text=CONNECTION_FORCED - broker forced connection closure with reason 'shutdown', class-id=0, method-id=0), null, ""}

16:05:55.048 WARN  [SimpleAsyncTaskExecutor-7][org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer] Consumer raised exception, processing can restart if the connection factory supports it. Exception summary: org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused
16:05:50.042警告[SimpleAsynctaskeExecutor-6][org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer]使用者引发的异常,如果连接工厂支持,处理可以重新启动。异常摘要:com.rabbitmq.client.ShutdownSignalException:连接错误;原因:{#方法(回复代码=320,回复文本=CONNECTION_FORCED-代理强制连接关闭,原因为'shutdown',类id=0,方法id=0),null,“}
16:05:55.048警告[SimpleAsynctaskeExecutor-7][org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer]使用者引发的异常,如果连接工厂支持,可以重新启动处理。异常摘要:org.springframework.amqp.AmqpConnectException:java.net.ConnectException:连接被拒绝
编辑:

还有一个
ConnectionListener
接口,您可以向连接工厂注册实现;您可以通过它了解新的连接,但是当前仅当通过销毁工厂显式关闭连接时才会调用
onClose()


但是,
onCreate()
为连接提供了一个句柄,因此您可以不时调用其
isOpen()
方法,但不要在
onCreate()
方法本身中执行此操作-保存连接。您必须退出
onCreate()
,才能使所有内容按计划工作。

添加了关于ConnectionListener接口的说明。谢谢Gary-我已为此提交了JIRA改进问题。对于你的建议,我确实有一个问题要问。在您描述的onCreate()中是否会获得连接句柄?(例如,在代理关闭之前,isOpen()将返回true;在代理关闭时,isOpen()将返回false;在连接工厂重新建立连接时,isOpen()将返回true)。一旦连接关闭,该特定实例将永远不会从
isOpen()
返回
true
。但是,当建立新连接时,将再次调用您的
ConnectionListener
,但这次将使用新连接。