首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySql数据库中多线程任务项的Java任务调度

MySql数据库中多线程任务项的Java任务调度
EN

Stack Overflow用户
提问于 2021-03-16 03:17:54
回答 2查看 462关注 0票数 2

我正在用java spring编写一个任务调度模块来处理存储在Mysql数据库中的任务项。

任务表的架构结构:

代码语言:javascript
运行
复制
ID | TASK_UUID | TASK_CONTENT(VARCHAR) | CREATED_TS | UPDATED_TS | STATUS(NEW/PROCESSING/COMPLETE)

我希望实现多个任务调度器工作人员,以从任务表中获取要执行的任务。以何种方式可以确保任务调度器不会同时执行相同的任务?有什么好的java框架我可以使用吗?

#Edit 1:任务执行模块被设计成由不同的机器运行,所以同步化的方法可能无法工作。

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

#Edit 3:每台机器都使用Quartz Scheduler运行,配置有一个固定的任务获取和执行作业。每个作业之间的时间间隔约为10秒。因此,我的目标是确保每个机器调度程序能够在每个石英作业运行中至少获取10个任务。

EN

回答 2

Stack Overflow用户

发布于 2021-03-16 03:33:26

可以将方法getTask创建为同步方法:

例:

代码语言:javascript
运行
复制
synchronized Task getTask() {
  // get NEW task from DB
  // update status to PROCESSING
  // return task
}

#Edit 1:如果是这样,只需使用SELECT FOR UPDATE查询来阻止其他查询来访问相同的任务。例:

代码语言:javascript
运行
复制
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> .

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

票数 1
EN

Stack Overflow用户

发布于 2021-03-16 05:25:03

你可以像这样解决原子性或事务问题,

使用任务的id,假设它是增量的。如果有三台机器运行任务调度。然后将id修改为3,并将结果0、1、2的任务分配给固定机器。所以不同的机器不会互相干扰(或种族条件)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66648656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档