我有一些临时文件,我打电话deleteOnExit()给.我也有一个可以运行的runnable,addShutdownHook()可以在System.exit调用时运行.
我的关机挂钩运行时是否保证临时文件仍然可用?
我需要根据我的应用程序结果修改JVM返回码.
但是显式调用System.exit(代码)是有风险的,因为应用程序很复杂,很难识别运行线程的结束.
所以我想出了在JVM退出之前使用shutdown hook修改返回代码.
但是有一个问题是如何获得JVM的原始返回码,因为它可能是错误代码而不是0.
Spring Boot 有没有办法控制应用程序的正常关闭?
我知道您可以@PreDestroy在 bean 中拥有方法,但是如何控制这些@PreDestroy方法的调用顺序?
您可以拥有多个相互依赖的 bean,上下文的关闭是否已经查找此依赖项并@PreDestroy以正确的顺序调用方法?
例如,我想要完成的是:
1)停止在休息端点上侦听新请求
2)防止兔子消息侦听器接受新消息
3)等待在关闭之前已开始但尚未完成的所有处理。
我有一个shutdownhook,它在进程终止时执行.但是,程序对h2数据库所做的更改不是持久的.只有当我在提交后让关闭线程等待一段时间后,当我再次启动时,我将看到数据库中的更改.
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
// H2 db add row, commit and close
Thread.sleep(1000); // in try/catch
System.out.println("Shutdown complete");
}
}
Run Code Online (Sandbox Code Playgroud)
只有a sleep,我会在下次连接到DB时看到更改.
有没有人知道在进程终止之前如何等待H2数据库完成操作?我希望Thread.sleep()随机时间避免...
问题是,我停止了Dropwizard应用程序(通过ctrl + c),我在主类中插入了一个Shutdown Hook,以便在关机前做一些事情.但是现在,在我可以做我想做的事情之前,应用程序的ServerConnector已关闭.
有一个轮询服务(轮询我的一个资源),我需要告诉他们,该应用程序将很快停止以防止一些问题.在资源停止之前我需要至少15秒.
有些想法如何解决这个问题?
我正在尝试在工作的 hadoop 集群上运行 spark。当我使用较小的数据集运行 python 作业时,一切似乎都正常。但是,当我使用更大的数据集时,任务失败并且在 hadoop 资源管理器中我得到了诊断信息:
在报告最终状态之前调用关闭挂钩。
我用来运行作业的命令是:
spark-submit --master yarn --deploy-mode cluster --conf \
spark.yarn.appMasterEnv.SPARK_HOME=/dev/null --conf \
spark.executorEnv.SPARK_HOME=/dev/null project-spark.py
Run Code Online (Sandbox Code Playgroud)
它只是生成一些数据并在生成的数据上运行 Spark 的 KMeans 算法的测试代码。
任何想法我应该做什么?任何帮助是极大的赞赏...
此外,我在由 4 个工作人员组成的 Hadoop v2.6.0 集群上使用 Spark v2.0.0,并使用 Anaconda2 v4.1.1
____更新
正如@rakesh.rakshit 建议我使用参数运行作业--master yarn-client并监控任务。我发现正如@ShuaiYuan 所建议的那样,我实际上有一个内存密集型部分不是通过导致问题的 Spark 函数完成的。
此外,似乎在 Spark 1.4.0 之外,SPARK_HOME由于此问题已解决,因此不需要设置变量。
我正在编写一个程序,在一个进程中创建多个线程。
我需要处理如果进程被某人使用kill -9信号或Ctrl + C从外部终止,我的程序应该在关闭之前执行一些操作,例如它应该将进程的状态更改为数据库中的中止。
我该如何处理?
我需要addShutdownHook()?或者还有其他更好的解决方案来解决我的问题吗?
我已经添加了 :
Runtime.getRuntime().addShutdownHook( new Thread() {
@Override
public void run() {
logger.info( "Running Shutdown Hook" );
//call some method
System.out.println( "Running Shutdown Hook" );
}
} );
Run Code Online (Sandbox Code Playgroud)
在我的主要方法中,但它似乎不起作用。
我试图让我的Java程序在我的unix服务器上正常退出.我有一个jar文件,我早上通过cron工作开始.然后在晚上,当我想关闭它时,我有一个cron作业,它调用一个找到PID和调用的脚本kill -9 <PID>.但是,当我以这种方式终止时,似乎没有激活我的关闭挂钩.我也试过kill <PID>(没有-9)我也遇到了同样的问题.如何确保调用关闭挂钩?或者,也许每天都有更好的方法来杀死我的进程.
class ShutdownHook {
ShutdownHook() {}
public void attachShutDownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Shut down hook activating");
}
});
System.out.println("Shut Down Hook Attached.");
}
}
Run Code Online (Sandbox Code Playgroud) 这是我的主要方法,它包含一个 shutdownhook:
public static void main(String args[]) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
JOptionPane.showMessageDialog(null, "Shutdown hook");
}
});
/* Create and display the form */
java.awt.EventQueue.invokeLater(
new Runnable() {
@Override
public void run() {
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
MyFrame frame = new MyFrame();
frame.setVisible(true);
}
});
}
Run Code Online (Sandbox Code Playgroud)
问题是JOptionPane根本不显示。相反,框架会关闭,但应用程序本身仍然运行。附言。我无法使用该WindowClosing事件,因为它不会在Mac OS XCmd上的+Q命令上触发。
Google Compute Engine以各种价格将所有规模的Linux VM从1核心租用到64核心.有大约1/4保证实例价格的"抢占"实例,但可以随时终止抢占实例(ACPI G2软关闭警告和〜30秒直到硬截止).虽然您可以提供启动和关闭脚本,但通常的方法似乎会导致不必要的开销,即必须创建其他软件以允许计算中断,并管理部分计算结果,而暂停到磁盘/恢复在笔记本电脑和台式机中看到的磁盘方案可能是一种更简单的存储和恢复计算方法,因此更为可取.
如果我在GCE上启动Linux可抢占的VM,是否可以暂时将VM的状态挂起到磁盘(也称为休眠),然后从磁盘重新启动一个新的可抢占的VM?我的想法是:
如何以这种方式配置Linux以暂停/恢复?
shutdown-hook ×10
java ×7
shutdown ×2
acpi ×1
apache-spark ×1
dropwizard ×1
events ×1
h2 ×1
hadoop-yarn ×1
hadoop2 ×1
java-io ×1
kill-process ×1
linux ×1
pyspark ×1
sigkill ×1
spring-boot ×1
swing ×1
unix ×1