我正在用java spring编写一个任务调度模块来处理存储在Mysql数据库中的任务项。
任务表的架构结构:
ID | TASK_UUID | TASK_CONTENT(VARCHAR) | CREATED_TS | UPDATED_TS | STATUS(NEW/PROCESSING/COMPLETE)
我希望实现多个任务调度器工作人员,以从任务表中获取要执行的任务。以何种方式可以确保任务调度器不会同时执行相同的任务?有什么好的java框架我可以使用吗?
#Edit 1:任务执行模块被设计成由不同的机器运行,所以同步化的方法可能无法工作。
#编辑2:每台机器都会得到随机或不规则的任务数。因此,如果使用自动增量序列,索引的分配大小也应该是不规则的,否则就会有一些任务无法处理。
#Edit 3:每台机器都使用Quartz Scheduler运行,配置有一个固定的任务获取和执行作业。每个作业之间的时间间隔约为10秒。因此,我的目标是确保每个机器调度程序能够在每个石英作业运行中至少获取10个任务。
发布于 2021-03-16 03:33:26
可以将方法getTask
创建为同步方法:
例:
synchronized Task getTask() {
// get NEW task from DB
// update status to PROCESSING
// return task
}
#Edit 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> .
您可以创建一个过程来包装查询。
发布于 2021-03-16 05:25:03
你可以像这样解决原子性或事务问题,
使用任务的id,假设它是增量的。如果有三台机器运行任务调度。然后将id修改为3,并将结果0、1、2的任务分配给固定机器。所以不同的机器不会互相干扰(或种族条件)。
https://stackoverflow.com/questions/66648656
复制相似问题