用脚本运行java jar文件

时间:2012-12-05 19:51:33

标签: java linux shell threadpool

我有一个我不知道如何解决的问题。我使用1个单线程的执行器服务创建了一个java轮询应用程序。该服务执行一些文件操作和数据库交互。

如果我们从命令promt / executable jar运行java -jar myapp.jar,它就会运行。我们随时都可以阻止它。

现在我需要为用户制作2个脚本(liek tomcat)。一个用于启动应用程序,另一个用于停止。

但是想到的是当用户执行脚本停止时,在完成执行程序服务的所有作业/线程之前,不会终止该进程。因为,如果我们在运行状态下终止进程,那么执行该作业的系统将停止处于不一致状态(例如在移动文件期间)。

问题是,我无法从shell脚本访问ExecutorService结果。

如何制作两个脚本来运行此应用并控制和访问行为。 ?

编辑:

我的myapp.jar运行定期执行程序服务。我需要创建一个停止脚本,它只允许在执行程序服务未运行任务之后停止,而不是终止进程。因为,如果我在操作过程中终止了进程,我就失去了系统的一致性。我的ssytem读取文件并将其移动到另一个目录中。如果我在中间杀死,一些文件将被处理,一些不会。我需要一个解决方案,如果用户从UNIX系统执行停止脚本,脚本要么不会终止进程,要么等到作业完成。

1 个答案:

答案 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)删除作为参数给出的指定挂钩。

您只需要在关闭钩子中添加正确的代码逻辑,如上所述。

参考链接javadocOne blog post