我有几个像这样运行的预定作业:
MyWorker.perform_at(3.hours.from_now, 'mike', 1)
我想知道,如果稍后,比如说一个小时后,我想取消这份工作,我该怎么做?
我最近编写了一些代码来处理这个问题,它可以在我的 sidekiq-status gem 分支中找到。你可以查看它,或者在这里使用它: https ://github.com/Robinson7D/sidekiq-status
(目前,您必须将其用作git:
gemfile 中的信息,直到项目的主分支实现这一点)
要使用它,首先要存储 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 的分叉上,您可以通过调用 unschedule 来触发它,而不是取消:
Sidekiq::Status.unschedule job_identifier
进一步:您还可以使用标准 Sidekiq gem 删除作业,如下所述:https ://github.com/mperham/sidekiq/wiki/API (尽管对于他们的方法,您需要计划作业时间的 unix-timestamp -您不能仅使用作业的 id 删除;如果您希望删除没有时间戳的作业,Sidekiq::Status 方法可能适合您)。
但是,与其在 wiki 中概述的方式不同,我会推荐一些类似于Sidekiq::ScheduledSet.new().delete(unix_timestamp, jid)
如果您只想删除一项工作的内容。)
据我所知,Sidekiq 目前无法取消日程安排工作。我写了一个服务,让我可以取消我的预定邮件。但是使用 redis 命令可以很容易地取消作业:
你会得到这样的日程安排工作:
schedules_jobs = $redis.zrange "schedule", 0, -1, {withscores: true}
然后你得到一系列工作,你选择一个工作并像这样取消它:
$redis.zrem "schedule", schedules_jobs[0]