【发布时间】:2021-06-13 08:22:33
【问题描述】:
我正在用java spring编写一个任务调度模块来处理存储在Mysql数据库中的任务项。
Task表的架构结构:
ID | TASK_UUID | TASK_CONTENT(VARCHAR) | CREATED_TS | UPDATED_TS | STATUS(NEW/PROCESSING/COMPLETE)
我想实现多个任务调度程序工作人员以从 Task 表中获取要执行的任务。我可以通过什么方式确保任务调度程序不会同时执行相同的任务?有什么好的java框架可以用吗?
#编辑1: 任务执行模块设计为由不同的机器运行,因此同步方法可能不起作用。
#编辑 2: 每台机器都会获得随机或不规则数量的任务。所以如果使用自增序列,索引的分配大小也应该是不规则的,否则会有一些任务永远处理不完。
#编辑 3: 每台机器都运行着 Quartz Scheduler,配置了一个恒定的任务获取和执行作业。每个作业之间的时间间隔约为10 秒。因此,我的目标是确保每个机器调度程序在每次石英作业运行中都能获取至少 10 个任务。
【问题讨论】:
-
使用数据库中事务的原子性。例如,添加一个“task scheduler id”列并设置它,如果它为空,就可以解决问题。如果在事务中完成。
-
所以@Erk 建议添加另一列有效地标识正在处理任务的机器的ID...
-
停止/失败/机器处理它死亡/等的任务怎么办?你怎么对付他们? (我提出问题是为了帮助您回答/帮助我们所有人回答)。
-
@MrR,是的,可能还需要时间戳列和超时处理。
-
@Kaguya 除非你需要一个master,DB是你的sequencer,所以任何机器都可以请求下一个任务,只有1台会得到它。
标签: java mysql spring scheduled-tasks quartz-scheduler