Руководство Кафки подтверждает перед закрытием 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;
    }

    ...

}
Другие вопросы по тегам