@Service
public class ShutdownListener {
private static final Logger LOGGER = Logger.getLogger(ShutdownListener.class);
@EventListener(ContextClosedEvent.class)
public void onContextClosed(ContextClosedEvent event) {
LOGGER.info("OAE: event :" + event);
ApplicationContext ctx = event.getApplicationContext();
LOGGER.info("OAE: context :" + ctx);
try {
LOGGER.info("sleeping");
TimeUnit.SECONDS.sleep(60);
LOGGER.info("slept");
} catch (InterruptedException e) {
LOGGER.error(e);
e.printStackTrace();
}
}当spring-boot应用程序在本地运行时,这可以很好地工作。
当app使用最新的( java - buildpack -v3.5.1.zip) java buildpack作为jar部署到pivotal cloud-foundry,并使用cf cli停止应用程序时,它指示onContextClosed方法已被触发,而不是等待它成功完成。
有什么建议吗?有什么想法?
发布于 2016-01-23 21:25:12
这实际上是前面解释的情况的一个特例。虽然钩子开始执行,但在操作系统关闭等情况下,它可能会在完成之前终止。在这种情况下,一旦给出SIGTERM,O/S就会等待进程终止一段指定的时间。如果进程未在此时间限制内终止,则O/S将通过发出SIGTERM (或Windows中的对应命令)来强制终止进程。因此,当关闭钩子执行到一半时,可能会发生这种情况。
发布于 2016-01-23 21:36:16
对指示超时的代码库的引用,在超时之后,将SIGKILL发送到JVM https://github.com/cloudfoundry/warden/blob/master/warden-protocol/lib/warden/protocol/pb/stop.proto#L9-L17
https://stackoverflow.com/questions/34956997
复制相似问题