You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Akka Quartz中创建指定时间仅执行一次的触发器?示例代码求助

解决Akka Quartz中一次性触发器的问题

首先,你的代码里有两个关键问题导致触发器没有按预期执行:

1. 错误的日期初始化(过时的Date构造方法坑)

你用的new Date(2019,1,9, 16,45)是过时且有陷阱的API:这个构造方法的月份参数是从0开始索引的!也就是说1对应的是二月,完全不是你想要的一月。而且这个构造方法在Java 8+已经被废弃,推荐使用java.time包下的类来处理日期,避免这类低级错误。

2. 未明确指定一次性执行的调度规则

虽然Quartz的SimpleTrigger默认重复次数是0(理论上会执行一次),但显式声明执行规则能避免潜在的配置歧义,让逻辑更清晰,也能防止后续Quartz版本默认行为变更带来的问题。

修复后的代码示例

下面是修正后的完整代码,结合Java 8的日期API确保日期正确,同时明确设置一次性执行逻辑:

import org.quartz._
import org.quartz.impl.StdSchedulerFactory
import java.time.{LocalDateTime, ZoneId}
import java.util.Date

// 1. 构建正确的目标时间:2019/01/09 22:00
val targetTime = LocalDateTime.of(2019, 1, 9, 22, 0)
val triggerStartTime = Date.from(targetTime.atZone(ZoneId.systemDefault()).toInstant())

// 2. 创建明确的一次性触发器
val trigger = TriggerBuilder.newTrigger()
  .withIdentity("Trigger", "Group")
  .startAt(triggerStartTime)
  // 显式设置只执行一次,消除默认行为的不确定性
  .withSchedule(SimpleScheduleBuilder.simpleSchedule().withRepeatCount(0))
  .build()

// 3. 关联你要执行的Job类(替换成你的实际Job类)
val jobDetail = JobBuilder.newJob(classOf[MyAkkaTaskJob])
  .withIdentity("OneTimeJob", "JobGroup")
  .build()

// 4. 注册到Scheduler并启动
val scheduler = StdSchedulerFactory.getDefaultScheduler()
scheduler.start()
scheduler.scheduleJob(jobDetail, trigger)

额外注意事项

  • 如果是在Akka环境中集成Quartz,确保你已经正确引入了akka-quartz-scheduler依赖,并且在Akka配置文件中启用了Quartz调度器。
  • 时区问题:上面的代码用了系统默认时区,如果你的业务需要特定时区,替换ZoneId.systemDefault()为目标时区(比如ZoneId.of("Asia/Shanghai"))。

内容的提问来源于stack exchange,提问作者HudsonHornet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:30:44