java - 石英触发器不会立即触发
问题描述
我想使用 jdbc 数据存储使用石英调度程序立即执行这项工作。但是,即使我使用 now() 或调用 triggerJob 进行调度,调度和触发触发之间也有 20-30 秒的延迟。
我试图用一个简单的触发器来执行这项工作:
JobKey key = //...
JobDetail jobDetail = newJob(jobBean.getClass())
.withIdentity(key)
.usingJobData(new JobDataMap(jobParams))
.storeDurably()
.build();
Trigger trigger = newTrigger()
.withIdentity(key.getName(), key.getGroup())
.startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withMisfireHandlingInstructionFireNow()
.withRepeatCount(0))
.build();
scheduler.scheduleJob(jobDetail, trigger);
而且我还尝试使用调度程序触发:
JobKey key = // ...
JobDetail jobDetail = newJob(jobBean.getClass())
.withIdentity(key)
.storeDurably()
.build();
scheduler.addJob(jobDetail, true);
scheduler.triggerJob(key, new JobDataMap(jobParams));
以下是显示延迟的侦听器日志。
2019-05-15 13:59:52,066Z INFO [nio-8081-exec-2] c.m.f.s.logger.SchedulingListener : Job added: newsJobTemplate:1557928791965
2019-05-15 13:59:52,066Z INFO [nio-8081-exec-2] c.m.f.s.logger.SchedulingListener : Job scheduled: newsJobTemplate:1557928791965
2019-05-15 14:00:18,660Z INFO [eduler_Worker-1] c.m.f.s.logger.TriggerStateListener : Trigger fired: QUARTZ_JOBS.newsJobTemplate:1557928791965 {}
2019-05-15 14:00:18,703Z INFO [eduler_Worker-1] c.m.f.s.logger.JobExecutionListener : Job will be executed: QUARTZ_JOBS.newsJobTemplate:1557928791965
2019-05-15 14:00:19,284Z INFO [eduler_Worker-1] c.m.f.s.logger.JobExecutionListener : Job was executed: QUARTZ_JOBS.newsJobTemplate:1557928791965
解决方案
我在这里和那里发现了表明问题与交易有关的碎屑。所以我从服务方法中删除了@Transactional,瞧,它起作用了。看起来当您调用 trigger 时,调度程序线程异步尝试从数据库中查找计划和触发器,但当时未提交事务。稍后调度程序线程再次查找数据库并最终找到它。
推荐阅读
- python - 给定一个纯文本和一个可能的密文,确定密文是否可以使用上述方案从纯文本形成
- node.js - 我们可以在电子 js 上禁用键盘输入吗
- python - 有没有办法根据键盘输入改变玩家面对的方向?Pyglet, Cocos2d
- c++ - 如何使用 g++ 在 c++ 20 中使用模块?
- sql - 加入日期到日期范围 SQL
- firebase - 每次打开应用程序时都会触发 Flutter Dynamic Link
- javascript - 防止弹出窗口冒泡
- elasticsearch - Vue Sstorefront 上的 Elasticsearch 查询
- powershell - PowerShell:在几个文本文件的每 50 个单词后添加一个新的空行
- vert.x - 如何在使用 vert.x 读取 ContainerRequestContext 内的请求正文的 quarkus 框架中使用 @ServerRequestFilter