4

我使用 Zend Server Jobs 并设置 max concurrent jobs = 4,需要此设置 - 许多高优先级作业需要尽快提供服务。

此外,我还有低优先级的作业,执行时间长 5-7 分钟 - 繁重的数据库操作 - 我希望这个作业一次运行一个 - 如果并行运行竞争数据库资源和超时。我有创建它们的循环(大约 30 个作业),我正在使用 getJobsList() 检查队列中是否存在具有正确名称的作业,获取最大的作业 ID 并设置为下一个作业的前任。然而,即使工作已经创建(第二次迭代)也不会被 getJobsList() 拾取,并且后续迭代不会拾取最大/最新的工作 ID...

创造就业机会是否涉及延迟?createHttpJob() 并遵循 getJobsList() 不会返回最近创建的...

在设置了前任并且前任失败后 - 如超时 - 它会自动使依赖项失败。

是否可以将前任设置为仅完成而不管状态如何-只是不在队列中或已经在运行?

4

1 回答 1

1

我试图找出你的问题,它把我带到了一个我在一段时间前解决的问题,我在这里分享我的问题/解决方案,这样你就可以从你的问题中找到一些出路,假设你能够更好地解决你的问题有一些提示。

我有一个相当简单的问题,我有一个必须发布的消息表(以便它们的状态从 Pending 更新为 Sent 或 Error)。现在让单个 JOB 运行并执行所有这些发送创建的问题,因此我必须生成多个实例,这些实例由 crontab 每 5 秒启动一次(为此我必须编写睡眠逻辑,因为默认情况下 cron 仅每分钟启动一次)。现在,每个作业都计划以 5 秒的间隔开始,并具有手动分配的特定 JOB-WORKER-ID 作为脚本的参数,因为我想要每个作业的 ID,因此同时没有重复的 JOB-WORKER-身份证有效。

为此,我保留了一个类似 JOB_LOG 的表,它记录所有作业并存储它的 start_time、end_time 和每个作业执行期间发送的消息数。现在每次我开始新的工作时,我都会检查相同的 JOB-WORKER-ID 是否正在运行?通过向 JOB_LOG 表触发以下查询。

SELECT end_time FROM JOB_LOG WHERE job_worker_id = <N> ORDER BY JOB_LOG_ID DESC

如果未指定 end_time,则表示 JOB 仍在运行,否则可以安全地启动新 JOB。:-)

表的表结构类似于以下内容:

job_log
 - job_log_id
 - start_time
 - end_time
 - message_sent_count
 - job_worker_id

我知道我的回答并不能完全解决您的问题,但我发现有一些相似之处,您可以从内部找到一些线索。

祝你好运。

于 2012-05-27T12:11:04.643 回答