多线程mysql数据库中任务项的java任务调度

ukqbszuj  于 2021-07-22  发布在  Java
关注(0)|答案(2)|浏览(303)

我正在javaspring中编写一个任务调度模块来处理存储在mysql数据库中的任务项。
任务表的架构结构:

ID | TASK_UUID | TASK_CONTENT(VARCHAR) | CREATED_TS | UPDATED_TS | STATUS(NEW/PROCESSING/COMPLETE)

我想实现多个任务调度器worker,从任务表中获取要执行的任务。如何确保任务调度器不会同时获得相同的任务来执行?有什么好的java框架我可以利用吗?

编辑1:任务执行模块被设计为由不同的机器运行,因此同步方法可能不起作用。

编辑2:每台机器将获得随机或不规则数量的任务。因此,如果使用自增序列,索引的分配大小也应该是不规则的,否则会有一些任务永远无法处理。

编辑3:每台机器都使用quartz调度器运行,配置了一个获取和执行作业的常量任务。每次作业之间的时间间隔约为10秒。因此,我的目标是确保每个机器调度器在每个quartz作业运行中至少可以获取10个任务。

mjqavswn

mjqavswn1#

你可以创建这个方法 getTask 作为同步方法:
如:

synchronized Task getTask() {
  // get NEW task from DB
  // update status to PROCESSING
  // return task
}

编辑1:如果是,只需使用SELECTFORUPDATE查询来阻止其他查询访问同一任务。如:

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> .

您可以创建一个过程来 Package 查询。

63lcw9qa

63lcw9qa2#

你可以这样处理原子性或事务问题,
使用任务的id,假设它是增量的。如果有三台机器运行任务调度。然后只需将id修改为3,并将结果为0、1、2的任务分配给固定的机器。所以不同的机器不会互相干扰(或竞争状况)

相关问题