0

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

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

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

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

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

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

编辑:

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

4

1 回答 1

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一篇博文

于 2012-12-05T20:31:21.723 回答