2013-04-15 45 views
12

我有運行這樣幾個調度作業:sidekiq取消列表來計劃作業

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

我想知道,如果以後,說一個小時後,我覺得我要取消這個工作,會怎樣我去做那件事?

回答

3

據我所知,Sidekiq目前無法取消時間表工作。我寫了一個服務,讓我取消定期發送的郵件。但你取消作業很容易與Redis命令:

你得到調度作業是這樣的:

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

然後你得到的工作數組,你挑一個工作,並取消它像這樣:

$redis.zrem "schedule", schedules_jobs[0] 
15

我最近寫了一些代碼來處理這個問題,它可以在我的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的叉子,你會通過調用取消調度觸發它,而不是取消:

Sidekiq::Status.unschedule job_identifier 

另外:你也可以使用標準Sidekiq寶石刪除作業如下解釋:https://github.com/mperham/sidekiq/wiki/API(儘管他們的方法,你需要Unix的時間戳作業計劃的時間 - 只能刪除作業的ID;如果您希望刪除沒有時間戳的作業,Sidekiq :: Status方法可能適合您)。

然而,可替換的方式,他們在wiki說明我會建議沿着Sidekiq::ScheduledSet.new().delete(unix_timestamp, jid)線的東西,如果你想刪除只有一個工作。)