在RabbitMQ中正确处理UnknownHostException,阻止自动恢复

时间:2017-09-05 15:33:45

标签: java spring rabbitmq amqp

我编写了一个Spring应用程序,它使用RabbitMQ客户端API手动实现RabbitMQ。

连接工厂和连接的设置方式与教程类似:

public class Recv {
  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv)
      throws java.io.IOException,
             java.lang.InterruptedException {

    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("122.34.1.1");
    factory.setPort(5672);
    factory.setUsername("user");
    factory.setPassword("password")
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
    ...
    }
}

连接正常。但是,如果我关闭我的主机服务器,我的应用程序似乎陷入某种循环,它试图通过持续ping关闭的主机来自动恢复。

因此,我的控制台充满了大量的“UnknownHostException”堆栈跟踪。根据stacktraces的确切位置是行:

Connection connection = factory.newConnection();

我试图在这一行附近放置一个try-catch块,但这似乎根本不起作用。

如果传统的try-catch块无法处理来自连接的异常,那么捕获异常并停止自动恢复创建此循环的正确方法是什么?

感谢。

1 个答案:

答案 0 :(得分:0)

尝试像这样设置你的兔子(两端):

@Bean
    public ConnectionFactory connectionFactory() {
        final CachingConnectionFactory connectionFactory = new CachingConnectionFactory(server);
        connectionFactory.setUsername("user");
        connectionFactory.setPassword("pass");
        return connectionFactory;
    }

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        final SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        return factory;
    }

默认情况下应设置端口。如果没有,它将在启动时显示,您可以更改它。队列应由消费者(主机或您称之为的任何东西)声明和设置。 如果没有,请在配置类中添加@EnableRabbit注释。

消费者宣布一个队列:

@RabbitListener(queues = "myQueue")
@Component
public class RabbitListener {

    @Bean
        public Queue getQueue() {
            return new Queue("myQueue");
        }

        @RabbitHandler
        public void getElementFromMyQueue(@Payload Object object) {

            // handle object as you want
    }
}

之后只是@Autowire兔子模板发送者,你应该好好去。即使主机已关闭,队列也应保持空闲但处于活动状态