Spring amqp слушатель восстановления потока - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь избежать ситуации, когда поток, читающий сообщения из очереди, не работает, но приложение запущено и работает, поэтому трудно обнаружить проблему.

Позволяет иметь код:

@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 Ответ

1 голос
/ 20 марта 2019

Добавление компонента ApplicationListener<ListenerContainerConsumerFailedEvent> или метода прослушивания событий ...

@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
...