Я использую Kstreams с приложением SpringBoot. Я добавил приведенный ниже код для обработки выключения для потоков.
KafkaStreams streams = new KafkaStreams(builder.build(), props);
final CountDownLatch latch = new CountDownLatch(1);
Runtime.getRuntime().addShutdownHook(new Thread("streams-shutdown-hook") {
@Override
public void run() {
streams.close(Duration.ofMillis(30000));
latch.countDown();
}
});
try {
streams.setUncaughtExceptionHandler((Thread t, Throwable e) -> {
logger.error("Stream stopped with uncaught error", e);
if (e.getCause() instanceof OffsetOutOfRangeException)
streams.cleanUp();
System.exit(1);
});
streams.start();
latch.await();
} catch (Throwable e) {
logger.error("Stream stopped with error");
System.exit(1);
}
Однако, когда используемый topi c недоступен в kafka, ловушка выключения никогда не достигается, приложение просто регистрирует завершение выключения и защелка застревает в ожидании, поэтому приложение никогда не закрывается. Как в этом случае выполнить плавное завершение работы?