【问题标题】:How to schedule a task on a given time like 7:15AM如何在给定时间(例如上午 7:15)安排任务
【发布时间】:2019-12-21 16:03:48
【问题描述】:

所以我想在早上 7 点 15 分这样的特定时间安排一个任务并想执行一次,我想使用 Quartz 但它使任务每隔一段时间执行一次(例如 5 分钟),但是我不想要这个我想根据实时安排任务。谢谢

【问题讨论】:

标签: java schedule quartz


【解决方案1】:

请使用 CronTrigger 表达式。例如:0 15 07 * * *

【讨论】:

  • 您能进一步解释一下吗?这个“CronTrigger 表达式”如何确保任务只运行一次
【解决方案2】:

并且想要执行一次,

我的一些旧代码会触发一次性计划作业

Calendar cal = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
cal.setTime(df.parse(job.getRunatDate()));
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(job.getRunatHour()));
cal.set(Calendar.MINUTE, Integer.parseInt(job.getRunatMin()));

log.debug ("One-off job at " + cal.getTime());

Trigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() 
                    .withIdentity("trigger" + job.getLineNumber(), "group1")
                    .startAt(cal.getTime()) 
                     .build();

sched = new StdSchedulerFactory().getScheduler();
sched.start();
sched.scheduleJob(job, trigger);

编辑

正如 Basic 所提到的,这是使用已被 JSR310 取代的非常古老的日期时间类。使用它或Three10 Backport

【讨论】:

  • 这些糟糕的日期时间类在 d 年前被 JSR 310 采用的 java.time 类所取代。
  • @BasilBourque 是的,我确实提到它是代码。 2014,如果这是任何借口。
【解决方案3】:

获取所需时区的当前时刻。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdtNow = ZonedDateTime.now( z ) ;

定义您的目标时间。

LocalTime targetTime = LocalTime.of( 7 , 15 ) ;

与当前时间比较。

LocalTime timeNow = zdtNow.toLocalTime() ;
ZonedDateTime targetZdt = zdtNow.with( targetTime ) ;
if( ! timeNow.isbefore( targetTime ) )
{
    targetZdt = targetZdt.plusDays( 1 ) ;  // Auto-adjusts if this time of day is not valid on that date in that zone. 
}

计算到那时所经过的时间。

Duration d = Duration.between( zdtNow , targetZdt ) ;

在 Duration 中等待一段时间后,使用 Executors 框架以单线程 ScheduledExcutorService 调度您的 Runnable 任务。搜索 Stack Overflow,因为这已被多次介绍。

【讨论】:

    【解决方案4】:

    感谢大家的帮助,我在这里找到了答案:

    CronTrigger 示例 1 - 创建触发器的表达式,每 5 分钟触发一次

    “0 0/5 * * * ?”

    CronTrigger 示例 2 - 创建一个触发器的表达式,该触发器每 5 分钟触发一次,在该分钟后 10 秒(即上午 10:00:10、上午 10:05:10 等)触发。

    “10 0/5 * * * ?”

    CronTrigger 示例 3 - 创建触发器的表达式,该触发器在每周三和周五的 10:30、11:30、12:30 和 13:30 触发。

    “0 30 10-13 ? * 周三、周五”

    CronTrigger 示例 4 - 用于创建触发器的表达式,该触发器在每月 5 日和 20 日的上午 8 点到 10 点之间每半小时触发一次。请注意,触发器不会在上午 10:00 触发,而是在 8:00、8:30、9:00 和 9:30 触发

    “0 0/30 8-9 5,20 * ?”

    请注意,有些调度要求过于复杂,无法用单个触发器来表达 - 例如“上午 9:00 到上午 10:00 之间每 5 分钟一次,下午 1:00 到晚上 10:00 之间每 20 分钟一次” .这种情况下的解决方案是简单地创建两个触发器,并注册它们以运行同一个作业。

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 1970-01-01
      • 2020-10-26
      • 2019-08-20
      • 2020-09-21
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      相关资源
      最近更新 更多