java - 如果 Quartz Scheduler 死了,我该如何停止它启动的子 Java 进程?

标签 java multithreading process

我目前在我们的 Windows 2003 Server Box 上使用 Quartz Scheduler 来替代 Cron。 我有两个需要在新 VM 中启动的特定作业,因此我使用 Java 5 中的 ProcessBuilder 对象来获取我的“Process”对象。 我遇到的问题是当我们的 Quartz Scheduler JVM 停止时,独立 JVM 中的 2 个作业继续运行。

        Process process = Runtime.getRuntime().exec(command);
        try
        {
            while (true)
            {

                Thread thread1 = new Thread(new ReaderThread(process.getInputStream()));
                Thread thread2 = new Thread(new ReaderThread(process.getErrorStream()));

                thread1.start();
                thread2.start();

                thread1.join();
                thread2.join();

当与我的 Quartz Scheduler 关联的父 JVM 死亡时,有没有办法杀死这些线程?即使我知道从不同的进程中手动杀死它们的方法,我也可以通过 Quartz 弄清楚如何做到这一点。

提前致谢

最佳答案

如果 Quartz JVM 正常退出,您可以在 finally block 中销毁进程。这可以避免对关闭 Hook 的需要。关闭 Hook 可能不会在 JVM 异常终止时执行。运行时 javadocs 状态,

If the virtual machine aborts then no guarantee can be made about whether or not any shutdown hooks will be run.

这是修改后的代码(我添加了一个超时和一个方法调用来等待进程退出)

    private static final long TIMEOUT_MS = 60000;
    Process process = Runtime.getRuntime().exec(command);
    try
    {
        while (true)
        {

            Thread thread1 = new Thread(new ReaderThread(process.getInputStream()));
            Thread thread2 = new Thread(new ReaderThread(process.getErrorStream()));

            thread1.start();
            thread2.start();

            process.waitFor();
            thread1.join(TIMEOUT_MS);
            thread2.join(TIMEOUT_MS);
            ...
        }
    } finally {
        process.destroy();
    }

总的来说,我发现从 Java 生成的进程很笨重而且不太灵活,考虑到需要两个 ReaderThread,您可能已经发现了这一点。特别是,卡住的子进程很难从 Java 中终止。作为最后的手段,您可以使用 Windows“taskkill”命令从命令行或计划任务中核对进程:

taskkill /IM MySpawnedProcess.exe

关于java - 如果 Quartz Scheduler 死了,我该如何停止它启动的子 Java 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/583800/

相关文章:

linux - 进程处于轮询状态?

c++ - 在 Mac OS X 上检测调试器

java - 如何在双/嵌套循环中脱离主/外循环?

java - 初学者关于Java多线程的问题以及synchronized block 和wait()/notify()的使用

android - 为什么在单独的线程上完成工作时 UI 线程会被阻塞?

java - SwingWorker 创建多线程

android - 您可以跟踪 Android 应用程序何时终止吗?

Java CSV Reader,读取剩余数据

java - 使用 java 将数据导出到 Excel - 未创建行

java - 无法在回收器 View 上接受 float 输入