Sidekiq для отмены списка запланированных заданий

У меня есть несколько запланированных заданий, работающих следующим образом:

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

Мне интересно, если позже, скажем, через час, я чувствую, что хочу отменить эту работу, как бы я это сделал?

Ответ 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), если вы хотите удалить только одно задание.)

Ответ 2

Насколько я знаю, у Sidekiq нет возможности отменить расписание на данный момент. Из-за этого я написал службу, которая позволяет мне отменить запланированные письма. Но вы редко выполняете задания с помощью команд redis:

Вы получаете задания по расписанию следующим образом:

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

Затем вы получаете массив заданий, и вы выбираете одно задание и отменяете его следующим образом:

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