我正在尝试在弹性beantalk应用程序上实现正常关闭,并且我将这种关闭测试放在一起-
主要-
public class Main {
public static void main(String[] args) throws InterruptedException {
ShutdownTest shutdownTest = new ShutdownTest();
shutdownTest.run();
System.out.println("END OF MAIN");
}
}
测试类-
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ShutdownTest {
private volatile long jobEnd;
private volatile boolean shutdown = false;
public void run() throws InterruptedException {
Thread mainThread = Thread.currentThread();
Thread shutdownHook = new Thread(() -> {
runShutdownTimer();
try {
System.out.println("Got shutdown signal.");
shutdown = true;
mainThread.join();
} catch(Exception e) {
System.out.println(e);
}
});
Runtime.getRuntime().addShutdownHook(shutdownHook);
while(!shutdown) {
long jobStart = System.currentTimeMillis();
int jobRunTime = 60000;
jobEnd = jobStart + jobRunTime;
Thread.sleep(jobRunTime);
}
System.out.println("End of Run");
}
public void runShutdownTimer() {
long start = System.currentTimeMillis();
float waitTime = (jobEnd - start)/1000f;
System.out.println("Shutdown phase should take " + waitTime + " seconds");
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.execute(() -> {
while(true) {
long now = System.currentTimeMillis();
float diff = (float)(now - start)/1000f;
System.out.println(diff + " seconds elapsed in shutdown phase");
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
如果我在本地运行此命令并发送关闭信号(^ C或通过我的IDE停止执行),我将得到类似-
的输出Shutdown phase should take 45.139 seconds
Got shutdown signal.
0.006 seconds elapsed in shutdown phase
0.311 seconds elapsed in shutdown phase
0.615 seconds elapsed in shutdown phase
...
44.433 seconds elapsed in shutdown phase
44.734 seconds elapsed in shutdown phase
45.035 seconds elapsed in shutdown phase
End of Run
END OF MAIN
<END OF EXECUTION>
但是,如果我在Elastic Beanstalk上运行此命令并通过推送新版本发送关闭信号,我将得到类似这样的信息-
Shutdown phase should take 25.647 seconds
Got shutdown signal.
0.007 seconds elapsed in shutdown phase
0.307 seconds elapsed in shutdown phase
0.607 seconds elapsed in shutdown phase
...
9.614 seconds elapsed in shutdown phase
9.915 seconds elapsed in shutdown phase
10.215 seconds elapsed in shutdown phase
<END OF EXECUTION>
我已经完成了几次,看来无论执行多少时间,执行都会在大约10秒左右强制退出。这些应用程序运行的作业可能要花费10秒钟以上的时间,具体取决于网络并要求无法控制的外部力量的速度。
有没有办法增加强制终止超时?
编辑:
我尝试将其装进盒子并通过pkill java
(无信号)杀死该进程。日志显示应用程序成功完成了28秒的关闭过程。我怀疑,有关弹性beantalk服务的信息正在发布第二个sigterm。当我弄清楚它是什么时,我会更新。
编辑编辑:
我研究了ASG生命周期挂钩。这些通过终止事件开始时发出cloudwatch事件来工作。此事件包含ec2实例ID,并且可以由SNS主题发送/路由。将ASG生命周期挂钩配置为发出此类事件时,它将等待确认终止可以以可配置的超时时间继续。这意味着ASG中的每个EC2可以侦听该SNS主题以了解其自身的终止事件,启动关闭过程,然后向ASG发出终止过程可以继续的警报。
这可以用于扩展,但是在更新EC2环境时将不起作用-导致重新启动。