我有一个应用程序,需要在每个日期更改时执行一些操作,如午夜。每当日期改变时,应该说相同的应用程序。任何有关如何实现该功能的帮助将不胜感激。
答案 0 :(得分:7)
您正在寻找的是一个调度程序。 Quartz可能是Java世界中最常用的调度程序,但如果您已经在使用该框架,则Spring会有一些有趣的调度功能。
无论您选择哪种调度程序,通常都会指定要执行的操作(有时称为“作业”)及其发生的时间(Quartz术语中的“触发器”)。在你的情况下,你将触发器设置为每天午夜运行,当它被解雇时,它会做你需要做的任何事情,正如你的工作所规定的那样。
答案 1 :(得分:1)
作为一个库,您可以使用Quartz
并将触发器设置为每晚午夜运行。我认为简单的触发器应该可以胜任。
或者,你可以通过使用一个单独的线程来实现Quartz自己做的事情,然后一直睡到下一个午夜。
答案 2 :(得分:0)
此问题的答案曾是Quartz。它是Java中调度的事实标准。它很容易使用,但它有点重量级。如果您不关心作业的集群调度或JDBC存储,那么quartz可能会过度。
值得庆幸的是,Spring 3.0带来了新的调度功能。这些允许简单的'做这个evey 30秒'或'每天午夜做'这种类型的日程安排,而不使用石英。如果您已经使用spring,那么设置非常简单。
示例:
<task:scheduler id="scheduler" pool-size="10"/>
<task:scheduled-tasks scheduler="scheduler">
<task:scheduled ref="anotherObject" method="anotherMethod" cron="* * 00 * * *"/>
</task:scheduled-tasks>
这将导致每天午夜在名为'anotherObject'的bean上调用方法'anotherMethod'。有关更多信息,请访问spring网站:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html
答案 3 :(得分:0)
你不需要一个庞大的框架。这样的事情应该有效。
import java.util.*;
public class Midnight {
public static void main(String args[]) {
MidnightCowboy mc = new MidnightCowboy();
mc.start();
// on with you normal program flow (if any) here
}
}
class MidnightCowboy extends Thread {
static final boolean COWS_COME_HOME = false;
// Whatever data you need should go here
public void run() {
while (! COWS_COME_HOME) {
GregorianCalendar now = new GregorianCalendar();
long nowMilli = now.getTimeInMillis();
now.add(Calendar.DAY_OF_MONTH, 1); // probably an easier way to set the time to the next midnight
now.set(Calendar.HOUR_OF_DAY, 0);
now.set(Calendar.MINUTE, 0);
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);
long midnightMilli = now.getTimeInMillis();
long delta = midnightMilli - nowMilli;
System.out.println("Waiting " + delta + " milliseconds until midnight.");
// How many milliseconds until the next midnight?
try {
sleep(delta);
doSomething();
} catch (InterruptedException e) {
System.err.println("I was rudely interrupted!");
}
}
}
void doSomething() {
// whatever
}
}
答案 4 :(得分:0)
如果你想要一个比整个库更轻量级的解决方案,我发现了一个非常简单的实现here。它基本上是Timer
类。
当首次通过
Start()
方法执行类时,代码获取当前时间的日期时间,然后获取午夜的datetime对象并减去2次以便给出一个时间,直到它是午夜此时,它设置定时器间隔并启动定时器。现在当达到间隔并且计时器触发其事件时,我使用相同的过程重置计时器。这将使间隔为24.当此计时器到期时,它将被重置并无限期重复。</ p>
答案 5 :(得分:-1)
如果你不想要Quartz或任何其他类似的框架,你可以简单地使用scheduleAtFixedRate的ScheduledExecutorService方法(这里有一个如何在JavaDoc中实例化一个)的例子。
你唯一需要考虑的是如何计算第一天的开始。
修改强>
正如Jarnbjo所说:这将无法在夏令时开关和闰秒中存活。因此,在使用Executor时请注意这一点。