这个问题很简单,但是我好一阵子都找不到答案。
我对我的Kafka使用者有手动确认,在关闭应用程序之前,我想执行一些代码,然后确认给Kafka。为此,我使用了@PreDestroy批注:
$.a.b.c.passportPhoto
现在主要的问题是,执行此操作之前,Kafka使用者已关闭,因此消息实际上并未得到确认,因此在启动应用程序时会再次收到消息,因此我需要某种解决方法或其他方法将此函数指定为关机前首先调用的函数。证明可以在日志中看到:
@PreDestroy
private void beforeShutdown() {
//do some code
acknowledgement.acknowledge(); //this variable is stored on class level
如果有人有建议,请告诉。
答案 0 :(得分:0)
实施SmartLifeCycle
并将代码放入stop()
。将bean放在很高的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;
}
...
}