春季启动rabbitMq setExceptionHandler

时间:2018-10-16 12:44:36

标签: spring spring-boot rabbitmq spring-rabbit spring-rabbitmq

如何使用Spring框架转换以下代码?

ConnectionFactory factory = new ConnectionFactory();
factory.setExceptionHandler(new BrokerExceptionHandler(logger, instance));

public final class BrokerExceptionHandler extends StrictExceptionHandler {
   @Override
   public void handleReturnListenerException(Channel channel, Throwable exception) {
        logger.log(Level.SEVERE, "ReturnListenerException detected: ReturnListener.handleReturn", exception);
        this.publishAlert(exception, "ReturnListener.handleReturn");
        logger.log(Level.SEVERE, "Close application", exception);
        System.exit(-1);
   }
  ....
}

基本上,如果发生RabbitMQ异常,则需要指定一个自定义异常处理程序,然后停止应用程序

每次出现异常时,如何发布RabbitMq消息?

编辑

我以这种方式修改了配置类:

@Bean
SimpleMessageListenerContainer containerPredict(ConnectionFactory connectionFactory,
  MessageListenerAdapter listenerPredictAdapter) {
     SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
     container.setConnectionFactory(connectionFactory);
     container.setDefaultRequeueRejected(false);
     container.setErrorHandler(new BrokerExceptionHandler());
     container.setQueueNames(getQueueName());
     container.setMessageListener(listenerAdapter);
     return container;
}

这是我的BrokerExceptionHandler类

public class BrokerExceptionHandler implements ErrorHandler {
   private final Logger logger = Logger.getLogger(getClass().getSimpleName());

   @Autowired
   private Helper helper;

   @Override
   public void handleError(Throwable t) {
     logger.log(Level.SEVERE, "Exception Detected. Publishing error alert");
     String message = "Exception detected. Message: " + t.getMessage());

     // Notify the error to the System sending a new RabbitMq message
     System.out.println("---> Before convertAndSend");
     rabbitTemplate.convertAndSend(exchange, routing, message);
     System.out.println("---> After convertAndSend");
   }
}

我可以在控制台中看到日志Exception Detected. Publishing error alert---> Before convertAdnSend,但是没有发布新的警报,并且日志---> After convertAndSend没有出现在控制台中。

这是日志:

  

2018-10-17 09:32:02.849错误1506 --- [tainer ****-1] BrokerExceptionHandler:检测到异常。发布错误警报

     

---> convertAndSend之前

     

2018-10-17 09:32:02.853信息1506 --- [tainer ****-1] osarlSimpleMessageListenerContainer:重新启动Consumer @ 4f5b08d:tags = [{amq.ctag-yUcUmg5BCo20ucG1wJZoWA = myechange}],频道=缓存的兔频道:AMQChannel(amqp://admin@XXX.XXX.XXX.XXX:5672 / testbed_simulators,1),conn:Proxy @ 3964d79共享的兔连接:SimpleConnection @ 61f39bb [delegate = amqp:// admin @ XXX .XXX.XXX.XXX:5672 / testbed_simulators,localPort = 51528],acceptMode = AUTO本地队列大小= 0

     

2018-10-17 09:32:02.905信息1506 --- [tainer ****-2] osamqp.rabbit.core.RabbitAdmin:自动声明非持久,自动删除或独占队列(myexchange)持久:假,自动删除:真,互斥:真。在连接工厂处于活动状态时,将重新声明代理是否停止并重新启动,但是所有消息都将丢失。

     

2018-10-17 09:32:02.905信息1506 --- [tainer ****-2] osamqp.rabbit.core.RabbitAdmin:自动声明非持久,自动删除或独占队列(myexchange)持久:假,自动删除:真,互斥:真。在连接工厂处于活动状态时,将重新声明代理是否停止并重新启动,但是所有消息都将丢失。

编辑

调试我发现在发送新消息之前,将调用以下代码:

File: SimpleMessageListenerContainer.class line 1212

if (!isActive(this.consumer) || aborted) {
  .....
}
else {
  ---> logger.info("Restarting " + this.consumer);
       restart(this.consumer);
}

编辑2

示例代码:http://github.com/fabry00/spring-boot-rabbitmq

0 个答案:

没有答案