У меня есть несколько запланированных заданий, работающих следующим образом:
MyWorker.perform_at(3.hours.from_now, 'mike', 1)
Мне интересно, если позже, скажем, через час, я чувствую, что хочу отменить эту работу, как бы я это сделал?
У меня есть несколько запланированных заданий, работающих следующим образом:
MyWorker.perform_at(3.hours.from_now, 'mike', 1)
Мне интересно, если позже, скажем, через час, я чувствую, что хочу отменить эту работу, как бы я это сделал?
Недавно я написал немного кода, чтобы справиться с этим, он доступен в моей ветке атрибута 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:: Status - https://github.com/utgarda/sidekiq-status. Вам больше не нужно использовать свою вилку. На вилке Утгарды вы вызовете его, позвонив нечеловечески, вместо отмены:
Sidekiq::Status.unschedule job_identifier
Далее: вы также можете удалить задания, используя стандартный камень Sidekiq, как описано здесь: https://github.com/mperham/sidekiq/wiki/API (хотя для их методов вам требуется unix-timestamp, когда задание запланировано - вы не можете удалить только с идентификатором задания, если вы хотите удалить задание без отметки времени, метод 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]