java - 使用脚本运行 java jar 文件

标签 java linux shell threadpool

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

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

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

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

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

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

编辑:

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

最佳答案

我想 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) 添加钩子(Hook)并
  • Runtime.getRuntime().removeShutdownHook(Thread h) 删除作为参数给出的指定 Hook 。

您只需按照上述说明在关闭 Hook 中添加适当的代码逻辑即可。

引用链接 javadoc , One blog post

关于java - 使用脚本运行 java jar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731249/

相关文章:

java - 如果单击可见 JPopupMenu 外部,则强制选择 JTable 行

java - 在 ExecutorService 中捕获所有 Futures/Callables 的异常

c++ - FreeLibrary() 在 Linux 上工作吗?

c# - 如何在 Mono HTTPListener 服务器中捕获 SSL 异常?

linux - 排空 ncat 管道

macos - SCP 说文件已下载,但文件未出现

java - 如何解决 put(String,long) 找不到合适的方法

java - 推断泛型类型而不创建新实例

python - 在特定情况下触发时输入验证停止工作

perl 脚本,只会打印 tomcat 版本