gpt4 book ai didi

java - 收到SIGTERM后如何正确关闭Spring bean?

转载 作者:行者123 更新时间:2023-12-01 18:03:52 26 4
gpt4 key购买 nike

我试图让我的应用程序保持 Activity 状态,以便监听来 self 的队列的一些消息。但是,一旦我的应用程序收到 SIGTERM,我想确保我的应用程序正常关闭。意思是,确保作业在内部首先在关闭之前完成。

读完之后,我想出了这个:

@Component
public class ParserListenerStarter {

public static void main(final String[] args) throws InterruptedException {
ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(ParserReceiveJmsContext.class);
context.registerShutdownHook();
System.out.println("Listening...");
Runtime.getRuntime().addShutdownHook( //
new Thread() {
@Override
public void run() {
System.out.println("Closing parser listener gracefully!");
context.close();
}
});

while (true) {
Thread.sleep(1000);
}
}

}

然后我向我的应用程序发送一个 kill 命令;这是我的输出:

Listening...
// output from my other beans here
Closing parser listener gracefully!

Process finished with exit code 143 (interrupted by signal 15: SIGTERM)

未调用我的 bean 中的 shutdown 方法:

@PreDestroy public void shutdown() {..}

我不是 Spring 方面的专家,所以对于我在这里遗漏的任何愚蠢的观点,我深表歉意。

如何关闭我的bean,然后很好地关闭我的应用程序?

最佳答案

您需要的一切:

context.registerShutdownHook();

因此,添加上面的代码,然后您的 @PreDestroy 方法将被调用。之后您无需执行任何其他操作。这意味着您必须可以删除

 Runtime.getRuntime().addShutdownHook( //
new Thread() {
@Override
public void run() {
System.out.println("Closing parser listener gracefully!");
context.close();
}
});

编辑: Documentation说你可以有多个关闭 Hook :

When the virtual machine begins its shutdown sequence it will start all registered shutdown hooks

所以下面的说法是错误的:

当你添加这个时,你替换了 Spring 钩子(Hook),它会销毁 beans,因为在内部,方法看起来像

if (this.shutdownHook == null) {
// No shutdown hook registered yet.
this.shutdownHook = new Thread() {
@Override
public void run() {
doClose();
}
};
Runtime.getRuntime().addShutdownHook(this.shutdownHook);
}

关于java - 收到SIGTERM后如何正确关闭Spring bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38399326/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com