Руководство Кафки подтверждает перед закрытием Spring Boot
Так что вопрос прост, но я не могу найти ответ в течение достаточно долгого времени.
У меня есть ручное подтверждение для моего потребителя Kafka, и, прежде чем приложение будет закрыто, я хотел бы выполнить некоторый код и затем подтвердить Kafka. Поэтому для этого я использую аннотацию @PreDestroy:
@PreDestroy
private void beforeShutdown() {
//do some code
acknowledgement.acknowledge(); //this variable is stored on class level
Теперь главная проблема заключается в том, что потребитель Kafka закрывается ДО того, как это выполнится, поэтому сообщения фактически не подтверждаются, и я получаю их снова при запуске приложения, поэтому мне нужен какой-то обходной путь или другой способ обозначить эту функцию как первое, что вызывается перед выключением. Доказательство этого можно увидеть в журнале:
Shutting down ExecutorService
Consumer stopped
Shutting down ExecutorService 'taskScheduler'
Shutting down ExecutorService 'applicationTaskExecutor'
EXECUTING MY CODE
[Producer clientId=producer-1] Closing the Kafka producer with timeoutMillis = 30000 ms.
Если у кого-то есть предложение, пожалуйста, сообщите.
1 ответ
Воплощать в жизнь SmartLifeCycle
и вставьте код в stop()
, Положите боб в очень высокий Phase
поэтому он останавливается перед контейнером. Контейнеры находятся в фазе Integer.MAX_VALUE - 100
по умолчанию, поэтому он должен быть выше.
РЕДАКТИРОВАТЬ
class Listener implements SmartLifecycle { // default phase is last (after the containers for start, before for stop).
private volatile boolean running;
@Override
public void start() {
this.running = true;
}
@Override
public void stop() {
this.running = false;
}
@Override
public boolean isRunning() {
return this.running;
}
...
}