java - 即使服务器停机,每 2 个月在第一天安排一个进程的最佳方法

标签 java spring quartz-scheduler crontrigger

我有一个简单的任务:即使服务器停机,我也需要每两个月的第一天运行一个进程 如果服务器不会宕机——任务就很简单:

ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
CronTrigger trigger = new CronTrigger("0 0 1 1 */2 ?");
scheduler.schedule(new Runnable() {
    @Override
    public void run() {
        // do the job
        job();
    }
}, trigger);

但是如果服务器宕机并且我一个月前运行我的工作怎么办? 在这种情况下,我想在下月初执行我的工作。 我上次执行作业时决定存储在数据库中:

private void job() {
// Store when the job was executed the last time
}

现在,当我的服务器启动时,我需要再次启动触发器,但不是立即启动。 我可以很容易地计算出何时启动触发器,但不幸的是我在 ThreadPoolTask​​Scheduler 中找不到合适的函数。有一个函数允许在启动时定期运行任务: public Sc​​heduledFuture ScheduleAtFixedRate(可运行任务,日期开始时间,长周期)

不幸的是,ThreadPoolTask​​Scheduler 不支持 public Sc​​heduledFuture 计划(可运行任务,日期开始时间,触发器触发器) 我使用额外的 Scheduler.execute 实现了该功能,但问题是是否可以使用一个调度来完成该功能。

最佳答案

您可以使用java.util.Timer为此,请在 TimerTask 实现中安排下一个 TimerTask。

如果必须正好是两个月,您应该在 TimerTask 启动时安排另一个 TimerTask,否则您可以在 TimerTask 结束时安排它。

关于java - 即使服务器停机,每 2 个月在第一天安排一个进程的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16146721/

相关文章:

java - 有什么方法可以使用自定义 BeanWrapper 实现来加载应用程序上下文

java - Spring Bean 属性 'xxx' 不可写或具有无效的 setter 方法

java - 如何同时运行两个代码段: one returns a String the other returns void

cluster-computing - 找到负责运行 Quartz 作业的节点

java - 在进行大量计算时提高性能 (BigInteger)

java - 从 servlet 响应生成动态复选框值

java - 访问 graphQL 查询的选择集

java - 读取 JSON 文件错误

quartz-scheduler - Quartz 调度器 : Register multiiple jobs under same trigger

java - quartz 和 mysql 的自动模式创建失败并出现 MySQLSyntaxException