我有一个我不知道如何解决的问题。我使用1个单线程的执行器服务创建了一个java轮询应用程序。该服务执行一些文件操作和数据库交互。
如果我们从命令promt / executable jar运行java -jar myapp.jar,它就会运行。我们随时都可以阻止它。
现在我需要为用户制作2个脚本(liek tomcat)。一个用于启动应用程序,另一个用于停止。
但是想到的是当用户执行脚本停止时,在完成执行程序服务的所有作业/线程之前,不会终止该进程。因为,如果我们在运行状态下终止进程,那么执行该作业的系统将停止处于不一致状态(例如在移动文件期间)。
问题是,我无法从shell脚本访问ExecutorService结果。
如何制作两个脚本来运行此应用并控制和访问行为。 ?
我的myapp.jar运行定期执行程序服务。我需要创建一个停止脚本,它只允许在执行程序服务未运行任务之后停止,而不是终止进程。因为,如果我在操作过程中终止了进程,我就失去了系统的一致性。我的ssytem读取文件并将其移动到另一个目录中。如果我在中间杀死,一些文件将被处理,一些不会。我需要一个解决方案,如果用户从UNIX系统执行停止脚本,脚本要么不会终止进程,要么等到作业完成。
答案 0 :(得分:1)
我想Shutdown Hook是您需要的解决方案。 Shutdown Hooks使用户可以完全控制执行关闭操作的线程。在给定正确的优先级,上下文和特权等的情况下,可以在适当的线程组中创建线程。
public class ShutDownHook {
public static void main(String[] args) {
final Thread mainThread = Thread.currentThread();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// Add your cleanup logic here
System.out.println("Shutdown hook is executing");
try {
mainThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
System.exit(0);
}
}
Shutdown hook is executing
Runtime.getRuntime().addShutdownHook(Thread h)
添加了钩子和Runtime.getRuntime().removeShutdownHook(Thread h)
删除作为参数给出的指定挂钩。 您只需要在关闭钩子中添加正确的代码逻辑,如上所述。
参考链接javadoc,One blog post