2017-06-01 104 views
1

当我停止RabbitMQ的服务器,下方将引发异常:如何在Spring AMQP框架下捕获AmqpConnectException?

org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused: connect 
    at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:62) ~[spring-rabbit-1.6.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:306) ~[spring-rabbit-1.6.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:547) ~[spring-rabbit-1.6.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1411) ~[spring-rabbit-1.6.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1392) ~[spring-rabbit-1.6.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1368) ~[spring-rabbit-1.6.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:336) ~[spring-rabbit-1.6.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.redeclareElementsIfNecessary(SimpleMessageListenerContainer.java:1123) [spring-rabbit-1.6.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$800(SimpleMessageListenerContainer.java:98) [spring-rabbit-1.6.6.RELEASE.jar:na] 
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1329) [spring-rabbit-1.6.6.RELEASE.jar:na] 
    at java.lang.Thread.run(Unknown Source) [na:1.8.0_121] 
Caused by: java.net.ConnectException: Connection refused: connect 
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_121] 
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) ~[na:1.8.0_121] 
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) ~[na:1.8.0_121] 
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) ~[na:1.8.0_121] 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) ~[na:1.8.0_121] 
    at java.net.PlainSocketImpl.connect(Unknown Source) ~[na:1.8.0_121] 
    at java.net.SocksSocketImpl.connect(Unknown Source) ~[na:1.8.0_121] 
    at java.net.Socket.connect(Unknown Source) ~[na:1.8.0_121] 
    at com.rabbitmq.client.impl.FrameHandlerFactory.create(FrameHandlerFactory.java:47) ~[amqp-client-3.6.5.jar:na] 
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:822) ~[amqp-client-3.6.5.jar:na] 
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:778) ~[amqp-client-3.6.5.jar:na] 
    at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:898) ~[amqp-client-3.6.5.jar:na] 
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:297) ~[spring-rabbit-1.6.6.RELEASE.jar:na] 
    ... 9 common frames omitted 

我怎么能捕获此异常?我应该创建还是实现一些处理程序?

回答

0

我有同样的问题。当我运行我的应用程序而不运行rabbitmq服务器时,我有这些无尽的错误消息。 因此,根据您的需求,很少有解决方案。

  1. 如果试图避免对相同的错误无尽消息,您可以配置RecoveryBackOff战略AbstractRabbitListenerContainerFactory

    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
    int maxAttempts = 3; 
    FixedBackOff recoveryBackOff = new FixedBackOff(DEFAULT_INTERVAL, maxAttempts); 
    factory.setRecoveryBackOff(recoveryBackOff); 
    

    这里,maxAttemps它尝试重新连接的最大数目。第一个参数是两次尝试之间的间隔(DEFAULT_INTERVAL = 5000ms)。

所以,在这种情况下SimpleMessageListenerContainer一样将尝试重新连接三次,并会平静下来。

  • 如果需要使用这些连接失败,你的猫实施春天ApplicationListenerListenerContainerConsumerFailedEvent,甚至更普遍的做一些事情 - AmqpEventas mentioned here