Spring AMQP侦听器线程恢复

时间:2019-03-20 14:38:19

标签: java spring-amqp

我试图避免这种情况,即从队列中读取消息的线程已死,但是应用程序已启动并正在运行,因此很难检测到问题。

让我们有代码:

@RabbitListener(queues = "${enc-correlation.correlation-request-queue}")
public void takeIndexTask(@Payload ConversationList list) throws InterruptedException {
   //just simulation of failure
   throw new OutOfMemoryError(); 
}

这将最终使应用程序运行,但不处理新消息。

我尝试了jvm参数:

-XX:OnOutOfMemoryError="kill -9 %p"

没有停止应用程序。是因为它在线程内部吗?

因此,唯一丑陋且可行的解决方案是:

    Thread.setDefaultUncaughtExceptionHandler((thread, t) -> {
        if (t instanceof OutOfMemoryError) {
            System.exit(1);
        }
    });

有没有办法,Spring amqp将如何监视侦听器线程,并且在“消失”的情况下将重新启动呢?

或者至少有可能在出现某些异常的情况下停止整个应用程序吗?

1 个答案:

答案 0 :(得分:1)

添加一个ApplicationListener<ListenerContainerConsumerFailedEvent> bean或事件侦听器方法...

@SpringBootApplication
public class So55263378Application {

    public static void main(String[] args) {
        SpringApplication.run(So55263378Application.class, args);
    }

    @RabbitListener(queues = "foo")
    public void listen(String in) {
        throw new OutOfMemoryError();
    }

    @EventListener
    public void listenForOOMs(ListenerContainerConsumerFailedEvent event) {
        System.out.println("Consumer thread died with " + event.getThrowable());
    }

}

Consumer thread died with java.lang.OutOfMemoryError