Java 如何创建执行TimerTasks的守护进程?
我需要在Java中创建一个守护进程,通过HTTP定期检索数据并将其存储在数据库中 当主线程启动时,它从配置文件中读取数据源和轮询间隔,并为每个数据源创建具有适当间隔的Java 如何创建执行TimerTasks的守护进程?,java,daemon,Java,Daemon,我需要在Java中创建一个守护进程,通过HTTP定期检索数据并将其存储在数据库中 当主线程启动时,它从配置文件中读取数据源和轮询间隔,并为每个数据源创建具有适当间隔的TimerTask。此外,它调用Runtime.getRuntime().addShutdownHook()来添加一个关机钩子,该钩子在关机之前执行任何需要的清理。在那之后,主线程就没有别的事情可做了 该守护进程旨在用于典型的Unix环境,即通过启动/停止脚本控制,但它应该可以移植到其他操作系统(例如,带有SrvAny的Window
TimerTask
。此外,它调用Runtime.getRuntime().addShutdownHook()
来添加一个关机钩子,该钩子在关机之前执行任何需要的清理。在那之后,主线程就没有别的事情可做了
该守护进程旨在用于典型的Unix环境,即通过启动/停止脚本控制,但它应该可以移植到其他操作系统(例如,带有SrvAny的Windows)
我该怎么办?如果我只是让主线程退出,
TimerTask
实例是否会保持VM运行,直到所有实例都被取消?如果没有,我将如何实现这一点?这取决于调度TimerTask
的计时器:如果创建该计时器是为了不将其任务作为守护进程运行,则即使在主线程完成其工作后,挂起的TimerTask
仍将使VM保持活动状态。这是所有计时器
构造函数的情况,这些构造函数不采用布尔
参数,或者布尔
参数为假
以下内容似乎按预期工作:
package com.example.daemon;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class SampleDaemon {
private static Timer testTimer = new Timer(false);
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Received shutdown request!");
if (testTimer != null)
testTimer.cancel();
testTimer = null;
}
});
testTimer.schedule(new TestTimerTask(), new Date(), 2000);
}
private static class TestTimerTask extends TimerTask {
@Override
public void run() {
System.out.println("Still running…");
}
}
}
它每2秒打印一次仍在运行的。
。当JVM收到SIGTERM
时,程序将打印收到的关机请求代码>并退出。这也可以通过从控制台发送Ctrl+C来实现<代码>SIGHUP
的作用与SIGTERM
相同
SIGCONT
无效SIGUSR1
导致硬退出(可能与SIGKILL
相同),即不执行关机挂钩。Java中的线程有一个标志,指示它们是否应该保持jvm活动。此标志称为“守护进程”:当只有守护进程线程运行时,jvm将退出
默认情况下,计时器启动的线程不是守护进程线程,因此它将使jvm保持活动状态,这正是您想要的。如果希望jvm退出,可以使用newtimer(true)
创建计时器-这将设置守护进程标志