处理RabbitMQ Spring Boot应用程序中的异常

时间:2017-05-09 10:15:43

标签: java spring-boot rabbitmq

我正在使用Spring Boot 1.4.1-RELEASE和RabbitMQ 3.2.3。我的Application类看起来像这样 -

@SpringBootApplication
@EnableAutoConfiguration
public class EventStoreMessageDeliveryApplication {

    public final static String queueName = "customer.default.queue"; // spring-boot

    @Bean
    Queue queue() {
        return new Queue(queueName, true);
    }

    @Bean
    FanoutExchange exchange() {

        return new FanoutExchange("customer.events.fanout.exchange", true, false); // spring-boot-exchange
    }

    @Bean
    Binding binding() {

        return new Binding(queueName, Binding.DestinationType.QUEUE, "customer.events.fanout.exchange", "*.*", null);
    }

    @Bean
    public ConnectionFactory connectionFactory() {

        CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
        connectionFactory.setPublisherConfirms(true);

        return connectionFactory;
    }

    @Bean
    SimpleMessageListenerContainer container(MessageListenerAdapter listenerAdapter) {

        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory());
        container.setQueueNames(queueName);
        container.setMessageListener(listenerAdapter);
        container.setRecoveryBackOff(new ExponentialBackOff(3000, 2));
        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver) {

        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    public static void main(String[] args) throws InterruptedException {

        SpringApplication.run(EventStoreMessageDeliveryApplication.class, args);
    }
}

我的听众课看起来像 -

@Component
public class Receiver {

    private CountDownLatch latch = new CountDownLatch(1);

    public void receiveMessage(String message) {

        System.out.println("Received <" + message + ">");

            // do something

        latch.countDown();
    }

    public CountDownLatch getLatch() {

        return latch;
    }

}

我想处理代理停机时可能出现的连接拒绝等异常。我该如何处理这些例外?我不知道在哪里可以获得异常处理。

2 个答案:

答案 0 :(得分:0)

您可以创建SimpleRabbitListenerContainerFactory。这基本上是来自RabbitConnectionFactory的事件的监听器。

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

rabbitErrorHandler()可以返回org.springframework.util.ErrorHandler的实现bean。

参考docs

答案 1 :(得分:0)

我有一个建议,这个建议可以解决。由于您希望拒绝RabbitMQ代理的连接异常,因此由客户端来捕获该异常。
在您的示例中,它看起来像是SpringIO docs中的示例,我假设您可以在主程序中进行异常处理(尽管不建议这样做):

@Component
    public class Runner implements CommandLineRunner {

        private final RabbitTemplate rabbitTemplate;
        private final Receiver receiver;

        public Runner(Receiver receiver, RabbitTemplate rabbitTemplate) {
            this.receiver = receiver;
            this.rabbitTemplate = rabbitTemplate;
        }

        @Override
        public void run(String... args) throws Exception {
            System.out.println("Sending message...");
            try {
                rabbitTemplate.convertAndSend(Application.topicExchangeName, "foo.bar.baz", "Hello from RabbitMQ!");
                receiver.getLatch().await(10000, TimeUnit.MILLISECONDS);
            }catch(AmqpException the_exception) {
                System.out.printl("Connection refused. Problem thrown when trying to connecto the RabbitMQ");
            }            
         }

    }

AmqpException来自convertAndSend()方法的文档,如果出现问题则抛出该文档。在这里您可以捕获自己的自定义消息。
我希望这是您正在寻找的东西,或者至少可以指导您正确的目的地。

/ A