我有几个按此运行的预定作业:
MyWorker.perform_at(3.hours.from_now, 'mike', 1)
我想知道,如果以后再说一小时后,我觉得我想要取消这份工作,我该怎么办呢?
答案 0 :(得分:16)
我最近编写了一些代码来处理这个问题,它可以在我的sidekiq-status gem的分支中找到。您可以查看它,或在此处使用它: https://github.com/Robinson7D/sidekiq-status
(当前,你必须使用它作为gemfile中的git:
信息,直到项目的主叉实现它为止。
要使用它,首先要存储job_identifier:
job_identifier = MyWorker.perform_at(3.hours.from_now, 'mike', 1)
当你想要销毁它时,你可以调用Sidekiq :: Status.cancel方法:
Sidekiq::Status.cancel job_identifier
编辑:自写这篇文章以来,我的代码被接受到Sidekiq :: Status - https://github.com/utgarda/sidekiq-status的主要分支中。你不再需要使用我的前叉了。在Utgarda的分叉上你会通过调用unchedule来触发它,而不是取消:
Sidekiq::Status.unschedule job_identifier
此外:您还可以使用标准的Sidekiq gem删除作业,如下所述:https://github.com/mperham/sidekiq/wiki/API(虽然对于他们的方法,您需要安排作业时的unix-timestamp - 您不能仅使用作业删除id;如果你想删除没有时间戳的作业,Sidekiq :: Status方法可能适合你)。
然而,如果你只想删除一份工作,我会推荐一些Sidekiq::ScheduledSet.new().delete(unix_timestamp, jid)
的内容,而不是他们在wiki中列出的方式。)
答案 1 :(得分:3)
据我所知,Sidekiq目前无法取消日程安排工作。我写了一个服务,让我取消我的预定邮件。但是使用redis命令可以轻松取消作业:
你得到这样的日程安排工作:
schedules_jobs = $redis.zrange "schedule", 0, -1, {withscores: true}
然后你得到一系列工作,然后你选择一份工作并取消它:
$redis.zrem "schedule", schedules_jobs[0]