Java 弹簧启动关闭前Kafka手动确认

Java 弹簧启动关闭前Kafka手动确认,java,spring-boot,apache-kafka,spring-kafka,predestroy,Java,Spring Boot,Apache Kafka,Spring Kafka,Predestroy,所以问题很简单,但我现在很长一段时间都找不到答案 我对我的Kafka消费者进行了手动确认,在应用程序关闭之前,我想执行一些代码,然后向Kafka确认。因此,我使用@PreDestroy注释: @PreDestroy private void beforeShutdown() { //do some code acknowledgement.acknowledge(); //this variable is stored on class level 现在主要的问题是Kafka

所以问题很简单,但我现在很长一段时间都找不到答案

我对我的Kafka消费者进行了手动确认,在应用程序关闭之前,我想执行一些代码,然后向Kafka确认。因此,我使用@PreDestroy注释:

@PreDestroy
private void beforeShutdown() {
    //do some code
    acknowledgement.acknowledge(); //this variable is stored on class level
现在主要的问题是Kafka consumer在执行之前被关闭,因此消息实际上没有得到确认,我在启动应用程序时再次收到它们,因此我需要某种解决方法或其他方法来指定此函数为关闭前调用的第一个函数。可以在日志中看到这方面的证据:

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.

如果有人有建议,请告知。

实施
SmartLifeCycle
,并将代码放入
stop()
。将bean置于一个非常高的
阶段
,使其在容器之前停止。默认情况下,容器处于阶段
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;
    }

    ...

}

你能举个例子吗?这似乎是个好主意,我现在已经阅读了文档,但不确定如何改变它的阶段?顺便说一句,文档中说默认相位是Integer.MAX_值,我看不到相位设置器..?什么没有设置器?阶段是在连接工厂bean上设置的。有关示例,请参见编辑。