【问题标题】:How can I catch connection exception using Spring RabbitMQ and MongoDB?如何使用 Spring RabbitMQ 和 MongoDB 捕获连接异常?
【发布时间】:2020-05-26 22:06:56
【问题描述】:

我正在使用 Spring,当 RabbitMQ 关闭时,我得到了异常抛出异常。我希望能够捕获它以打印诸如“重试连接”之类的内容。

org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused (Connection refused)
        at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:62) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:510) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:751) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.createConnection(ConnectionFactoryUtils.java:215) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:2085) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2058) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2038) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueInfo(RabbitAdmin.java:407) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:391) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.attemptDeclarations(AbstractMessageListenerContainer.java:1820) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.redeclareElementsIfNecessary(AbstractMessageListenerContainer.java:1801) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.initialize(SimpleMessageListenerContainer.java:1337) [spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1183) [spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
        at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_212]
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_212]
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_212]
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_212]
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_212]
        at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_212]
        at com.rabbitmq.client.impl.SocketFrameHandlerFactory.create(SocketFrameHandlerFactory.java:60) ~[amqp-client-5.7.3.jar!/:5.7.3]
        at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1113) ~[amqp-client-5.7.3.jar!/:5.7.3]
        at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:1063) ~[amqp-client-5.7.3.jar!/:5.7.3]
        at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.connect(AbstractConnectionFactory.java:526) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]
        at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:473) ~[spring-rabbit-2.2.2.RELEASE.jar!/:2.2.2.RELEASE]

MongoDB 在失去连接时也会发生同样的情况,我也想这样做。

com.mongodb.MongoSocketException: mongo: Name does not resolve
            at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:211) ~[mongo-java-driver-3.10.1.jar!/:na]
            at com.mongodb.internal.connection.SocketStream.initializeSocket(SocketStream.java:75) ~[mongo-java-driver-3.10.1.jar!/:na]
            at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:65) ~[mongo-java-driver-3.10.1.jar!/:na]
            com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongo-java-driver-3.10.1.jar!/:na]
            at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:131) ~[mongo-java-driver-3.10.1.jar!/:na]
            at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
Caused by: java.net.UnknownHostException: mongo: Name does not resolve
            at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) ~[na:1.8.0_212]
            at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:929) ~[na:1.8.0_212]
            at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1324) ~[na:1.8.0_212]
            at java.net.InetAddress.getAllByName0(InetAddress.java:1277) ~[na:1.8.0_212]
            at java.net.InetAddress.getAllByName(InetAddress.java:1193) ~[na:1.8.0_212]
            at java.net.InetAddress.getAllByName(InetAddress.java:1127) ~[na:1.8.0_212]
            at com.mongodb.ServerAddress.getSocketAddresses(ServerAddress.java:203) ~[mongo-java-driver-3.10.1.jar!/:na]
            ... 5 common frames omitted

有没有办法使用弹簧捕捉它们?

【问题讨论】:

    标签: java mongodb spring-boot exception rabbitmq


    【解决方案1】:

    ConnectionFactory 接口可以注入到你的rabbitmq 配置中,允许ConnectionListener 接口的setting an instance。该接口提供了 3 种有用的连接监控方法:

    // connectionFactory is injected connection factory of type ConnectionFactory
    
    connectionFactory.addConnectionListener(new ConnectionListener() {
      @Override
      public void onCreate(Connection connection) {
        log.info("Method onCreate was called! Info about connection {}", connection);
      }
    
      @Override
      public void onClose(Connection connection) {
        log.info("Method onClose was called! Info about connection {}", connection);
      }
    
      @Override
      public void onShutDown(ShutdownSignalException signal) {
        log.info("Method onShutdown was called! The connection will be restored automatically. Check the exception below for more info.", signal);
      }
    });
    

    onShutDown 方法是通知所有人您正在尝试恢复连接的好地方。

    【讨论】:

    • 我不知道我是否做错了什么,但似乎无法让它发挥作用。异常仍然打印,并且似乎没有调用这些方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多