【问题标题】:running java jar files with script使用脚本运行 java jar 文件
【发布时间】:2012-12-05 19:51:32
【问题描述】:

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

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

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

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

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

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

编辑:

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

【问题讨论】:

  • 您在停止脚本中到底在做什么?我猜您正在使用ps 搜索具有特定名称的进程,然后发出kill -9 命令。如果进程在ExecutorService 中停止,你会怎么做?
  • @mtk ,myapp.jar 运行定期执行器服务。我需要制作一个停止脚本,它只允许在执行程序服务未运行任务后停止,而不是终止进程。因为,如果我在运行过程中杀死进程,我就会失去系统的一致性。我的系统读取文件并将其移动到另一个目录中。如果我在中间杀死,有些文件会被处理,有些则不会。我需要一个解决方案,如果用户从 UNIX 系统执行停止脚本,该脚本要么不会终止进程,要么等到作业完成。

标签: java linux shell threadpool


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-14
    • 2013-03-09
    • 2013-05-05
    • 2023-03-19
    • 1970-01-01
    • 2019-12-02
    • 2020-09-14
    • 2022-01-08
    相关资源
    最近更新 更多