我正在使用Sidekiq根据用户提供的计划安排一些任务。但是,如果用户更改了计划,我希望能够使用新计划更新旧计划。
建议一
我看到了一个建议,只是找到Sidekiq::ScheduledSet.new.find_job(job_id)
的旧工作,但我试图避免创建一个新模型只是为了简单地存储工作ID和任务。
建议二
我看到的另一个建议是让工作人员检查任务的时间是否与当前时间匹配,但这不起作用,因为如果服务器处于脱机状态,则当它返回在线时它不会处理作业,因为时间是那些延迟的工作将与当前时间不符。
如果我可以分配自己的作业ID,例如作业名称的十六进制版本或任务ID的填充版本,那么我可以轻松地避免创建新模型来存储作业ID。因此,当用户重新安排任务时,那将更容易。
其他想法
也许如果我可以检查作业的at
属性并将其与任务相匹配,那可能会有效,但我不确定如何在不知道作业ID的情况下从工作人员中访问该属性。
编辑
我只是尝试拉出当前作业的at
属性,但看起来一旦作业开始,它就不再存在于Sidekiq::ScheduledSet
中,所以这个作业的时间与任务的时间从它看起来没有匹配。
我正在使用Sidekiq根据用户提供的时间表安排一些任务...
有一个扩展。 Sidekiq-Scheduler为您提供了类似cron的计划配置文件。然后,您可以根据需要更改计划。这似乎是最好的选择,因为它避免了编写自己的调度程序接口。
我可以将自己的随机职位ID分配给Sidekiq吗?
是的,虽然没有证件。你可以给Sidekiq::Client.push
一个jid
属性。
Sidekiq::Client.push('class' => MyWorker, 'args' => [1, 2, 3], 'jid' => ... )
这不是解决问题的好方法。它依赖于未记录的功能。并且它会引发与正常Sidekiq ID的冲突。
也许如果我可以检查属性的作业并将其与任务相匹配,那可能会有效,但我不知道如何在不知道作业ID的情况下从工作人员中访问该属性。
这听起来很容易出错。无论如何,您必须将时间戳存储在模型中。最好先存储作业ID。
我试图避免必须创建一个新模型只是为了简单地存储作业ID和任务。
在模型中存储东西是Rails真正做得很好的。这似乎是要走的路。这需要大量的编码,数据库存储和处理。您应该为预定作业设置模型,视图和控制器,否则您将如何创建预定作业并查看日程安排?
然而,Sidekiq docs notes认为find_job
是“缓慢,低效的操作。不要在正常条件下使用.Sidekiq Pro包含更快的版本。”这是因为它必须遍历所有作业。
我有一个案例,我必须根据用户的更新重新安排工作。它实际上非常缓慢和复杂。
不重新安排更简单,而是使旧的排队任务无操作(无操作),然后排队新任务。
这基本上由任务中的逻辑定义。您必须知道用户以某种方式更新了他们的日程安排,并在旧的工作中检查并基于一些if-check,而不是完成工作。