2013-04-15 3 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. Вы можете увидеть его, или использовать его здесь: 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 :: Статус - https://github.com/utgarda/sidekiq-status. Вам больше не нужно использовать свою вилку. На развилке Utgarda ты бы вызвать его по телефону запланированными, вместо того, чтобы отменить:

Sidekiq::Status.unschedule job_identifier 

Далее: Вы можете также удалять задания, используя стандартный Sidekiq камень, как описано здесь: https://github.com/mperham/sidekiq/wiki/API (хотя для их методов вам требуется UNIX-метка когда задание запланировано - вы не можете удалить только с идентификатором задания, если вы хотите удалить задание без отметки времени, метод Sidekiq :: Status может быть прав для вас).

Однако вместо пути они обрисовать в вики я бы рекомендовал что-то вдоль линий Sidekiq::ScheduledSet.new().delete(unix_timestamp, jid), если вы хотите удалить только одну работу.)