13

我有几个像这样运行的预定作业:

MyWorker.perform_at(3.hours.from_now, 'mike', 1)

我想知道,如果稍后,比如说一个小时后,我想取消这份工作,我该怎么做?

4

2 回答 2

16

我最近编写了一些代码来处理这个问题,它可以在我的 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)如果您只想删除一项工作的内容。)

于 2013-07-26T01:17:38.170 回答
3

据我所知,Sidekiq 目前无法取消日程安排工作。我写了一个服务,让我可以取消我的预定邮件。但是使用 redis 命令可以很容易地取消作业:

你会得到这样的日程安排工作:

schedules_jobs = $redis.zrange "schedule", 0, -1, {withscores: true}

然后你得到一系列工作,你选择一个工作并像这样取消它:

$redis.zrem "schedule", schedules_jobs[0]
于 2013-05-13T16:11:09.643 回答