我正在用javaspring编写一个任务调度模块,用于处理存储在Mysql数据库中的任务项。
任务表的模式结构:
ID | TASK_UUID | TASK_CONTENT(VARCHAR) | CREATED_TS | UPDATED_TS | STATUS(NEW/PROCESSING/COMPLETE)
我想实现多个任务调度程序工作程序,以便从task表中获取要执行的任务。我可以通过什么方式确保任务调度器不会同时获得相同的任务执行?有什么好的java框架我可以利用吗?
#编辑1:任务执行模块被设计为由不同的机器运行,因此同步方法可能不起作用。
#编辑2:每台机器将获得随机或不规则数量的任务。因此,如果使用自动递增序列,索引的分配大小也应该是不规则的,否则会有一些任务永远无法处理。
#编辑3:每台机器都运行Quartz Scheduler,配置有一个恒定的任务获取和执行作业。每个作业之间的时间间隔约为10秒。因此,我的目标是确保每个机器调度程序在每个石英作业运行中至少能获取10个任务。
您可以将方法getTask
创建为同步方法:
例如:
synchronized Task getTask() {
// get NEW task from DB
// update status to PROCESSING
// return task
}
#编辑1:如果是这样,只需使用SELECT FOR UPDATE查询来阻止其他查询访问同一任务。例如:
SELECT * FROM Task t WHERE t.status = NEW ORDER BY t.created_ts LIMIT 1 FOR UPDATE;
UPDATE Task SET status = PROCESSING WHERE id = <the task id> .
您可以创建一个过程来包装查询。
您可以像这样处理原子性或事务问题,
使用任务的id,假设它是增量的。如果您有三台机器在运行任务调度。然后只需将id修改三,并将结果为0、1、2的任务分配给一台固定的机器。所以不同的机器不会互相干扰(或比赛条件(