我的计划有一个分配成的调度程序,可以让其他部件登记册的时间点,他们希望被召回。这应该很像Unix cron服务,i。e.你告诉的调度程序"通知我在十分钟过去的每一个小时"。

我意识到没有真正的回调。

这里是我办法,是有一个图书馆已经没有这东西?随时提出改进。

注册呼叫调度通行证:

  • 时间说明书中包含小时、分钟,第二年一个月,唐氏,其中每个项目可能没有指定,意思是"执行每一小时/分钟的条件等。" (只是喜欢crontabs)
  • 对象包含的数据会告诉所呼吁的对象是什么做的时候,它是通过调度程序。该调度程序将不会处理此数据,就把它存储和传递回来后通知。
  • 一个参考的呼吁对象

启动时或之后的一个新的注册要求,该调度程序开始的日历对象的当前系统的时间和检查是否有任何条目的数据库匹配这个时间点。如果有,它们是执行和进程的开始。如果没有,时间在该日历的对象是增加一个第二和entreis重新检查.此重复,直到有一项或多个匹配的(es)。(离散事件的模拟)

该调度程序将然后记住,时间戳、睡眠和清醒每一个第二次检查,如果它已经存在。如果发生这种情况醒来的时间已经过去了,它开始了,同样,如果时间已经到来的工作已经执行。


编辑:谢谢你指点我的石英。我在寻找东西要小得多,但是。

有帮助吗?

解决方案

如果你需要的是简单的,可考虑使用 java。工具.计时器:

public class TimerDemo {

  public static void main(String[] args) {
    // non-daemon threads prevent termination of VM
    final boolean isDaemon = false;
    Timer timer = new Timer(isDaemon);

    final long threeSeconds = 3 * 1000;
    final long delay = 0;
    timer.schedule(new HelloTask(), delay, threeSeconds);

    Calendar calendar = Calendar.getInstance();
    calendar.add(Calendar.MINUTE, 1);
    Date oneMinuteFromNow = calendar.getTime();

    timer.schedule(new KillTask(timer), oneMinuteFromNow);
  }

  static class HelloTask extends TimerTask {
    @Override
    public void run() {
      System.out.println("Hello");
    }
  }

  static class KillTask extends TimerTask {

    private final Timer timer;

    public KillTask(Timer timer) {
      this.timer = timer;
    }

    @Override
    public void run() {
      System.out.println("Cancelling timer");
      timer.cancel();
    }
  }

}

如已 注意到, , ExecutorServicejava。工具.并发 提供更丰富的API如果您需要它。

其他提示

查找 石英

如果你的对象知道单个时间点,他们希望以执行,然后你可以用一个 java.util.concurrent.ScheduledExecutorService.然后他们简单的电话:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
long timeToExecute = ... //read from DB? use CronTrigger?
long delayToExecution = timeToExecute - System.currentTimeMillis();
scheduler.schedule(aRunnable, delayToExecution, TimeUnit.MILLISECONDS);

你只需要使用 Quartz 如果你想要的计划程序本身,以处理功能,例如"执行每5秒",或者如果你想要复杂的行为,围绕未接执行,或者持续不执行的审计线索。

实际上你可以平凡重新使用石英 CronTrigger 类得到一个"下一个执行时间"。该课是完全独立的,并不取决于被调用内 Quartz "上下文"中。一旦你的下一个执行时间为 Datelong, 你可以只使用Java ScheduledExecutorService 如上

石英 是的大和明显的强国在这一领域,但也有一些替代方案的探索。

Cron4j 是一个体面的足够的图书馆,这是一个小小的更轻便于石英。它提供了良好的文件,并会做你想要什么。

也许更有趣的是如果你想使用一个图书馆,更适合与Java的并发图书馆(特别是执行者和ScheduledExecutors)然后 HA-JDBC 有一个 CronExecutorService 接口,实现它的 CronThreadPoolExecutor.现在,有趣的是,它依赖于石英(提供CronExpression类),但是我找到那两个在一起更好地工作,不仅仅是石英独自一人。如果你不想大的依赖性,它很容易提取的几类从石英和HA-JDBC,使这种情况发生。

因为你想要的东西要小得多(只是注意到你的编辑),抢CronExpression从石英和两个HA-JDBC类我上面提到的。那将这样做。

我强烈推荐 cron4j (已经提到)在石,除非绝对需要一些更先进和复杂的功能的石英。Cron4j的重点很好,它是什么该做,具有体面的文件,而不是一个厨房水槽的解决方案。

石英的调度程序 通常的建议。

不能相信java。工具.计时器就投票作了回答。石英真的是一个更好的选择。

一个很大的优势的石英过java。工具.定时器,用石英的工作可以被存储在数据库。作为结果一个jvm可以计划和另一个可以执行。还(显然)的请求生存的跨jvm重新启动。

也许更有趣的是如果你想使用一个图书馆,更适合与Java的并发图书馆(特别是执行者和ScheduledExecutors)然后HA-JDBC有CronExecutorService接口,实现通过其CronThreadPoolExecutor.现在,有趣的是,它依赖于石英(提供CronExpression类),但是我找到那两个在一起更好地工作,不仅仅是石英独自一人。如果你不想大的依赖性,它很容易提取的几类从石英和HA-JDBC,使这种情况发生。

我只是想说我试图抽出这些类别,和它的工作!我需要这三类:

  • CronExpression(石英)
  • CronThreadPoolExecutor(ha-jdbc)
  • DaemonThreadFactory(ha-jdbc)

我只需要做这些小调整:

  • 除去的记录从CronThreadPoolExecutor(它的建立,但是从来没有使用)
  • 移恒YEAR_TO_GIVEUP_SCHEDULING_AT从CronTrigger到CronExpression

我很兴奋,我没有得到卡拉在纠结的依赖关系。恭喜类的作者!

和它一直工作就像一个冠军。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top