Обновить частоту Sidekiq работу


Я работаю на функцию, которую пользователь может установить частоту работы. Я использую Sidekiq.

Мое решение-это когда кто-то обновляет частоты от просмотра, я буду удалять все старые запланированные задания и создайте новое задание в действия контроллера.

Я ищу чище и более лаконичный способ сделать это.

Сейчас у меня есть столбец частот в таблице параметров. Есть update_frequency способ в DashboardController удалить все старые запланированные задания и создать новое запланированное задание.

приложение/контроллеры/dashboard_controller.РБ

class DashboardController < ApplicationController
  def update_frequency
    setting = Setting.find_by(id: params[:id])
    if setting.blank?
      render json: {status: 404, msg: 'Not found.'}
    else
      if setting.update_attributes(frequency: params[:frequency])
        # find and delete all scheduled jobs
        scheduler = Sidekiq::ScheduledSet.new
        old_jobs = scheduler.select {|work| work.klass == 'HardWorker'}
        old_jobs.each(&:delete) if old_jobs.present?

        # add new schedule job
        HardWorker.perform_in(setting.frequency.minutes)

        render json: {status: 200, msg: 'update frequency successful.'}
      else
        render json: {status: 500, msg: 'update frequency failed.'}
      end
    end
end

А HardWorker чтобы что-то сделать и создать новое запланированное задание:

приложение/работников/hard_worker.РБ

class HardWorker
  include Sidekiq::Worker

  def perform
    # Do something
    setting = Setting.first
    HardWorker.perform_in(setting.frequency.minutes)
  end
end


140
0
задан 21 марта 2018 в 03:03 Источник Поделиться
Комментарии
1 ответ

Я не думаю, что есть более лаконичный способ сделать это с Sidekiq, вам, вероятно, потребуется удалить и повторно создать рабочие места.

Некоторые комментарии

Вы, вероятно, не нужно, чтобы проверить if old_jobs.present? при удалении. Я не знаком с ScheduledSet#select но я бы предполагал, что она возвращает пустой массив, если нет задания.

Вам не нужно обновлять свои рабочие места, когда частота совпадает с одним уже установленным. Даже если вы проверить его на сайте это хорошая идея, чтобы проверить его здесь, чтобы в случае, если вид и базы данных не синхронизированы (читай: в случае если кто-то изменил настройки, а ваш взгляд был открытым).

Вместо использования вложенных "если", мне нравится использовать охранников.
Я также хотел бы извлечь локальные переменные методов (см. def setting).

Вот пример, как можно переделать его.

Это может показаться больше, но это легче понять, если взглянуть на update_frequency метод. Если вам нужно более точное представление о том, что считается same_frequencyили reschedule_jobsтогда вы можете погрузиться в эти методы. В противном случае, глядя на update_frequency наверное, дает вам все, что вы должны понять при просмотре кода (в 6 месяцев, когда вы будете забывать об этой части)

class DashboardController < ApplicationController
def update_frequency
return render_not_found unless setting
return render_same_frequency if same_frequency?
return render_update_failed unless update_model

reschedule_jobs

render json: { status: 200, msg: 'update frequency successful.' }
end

def render_not_found
render json: { status: 404, msg: 'Not found.' }
end

def render_update_failed
render json: { status: 500, msg: 'update frequency failed.' }
end

def render_same_frequency
render json: { status: 200, msg: 'Frequency updated to the same value' }
end

def update_model
setting.update_attributes(frequency: new_frequency)
end

def same_frequency?
setting.frequency == params[:frequency].to_i
end

def setting
@setting ||= Setting.find_by(id: params[:id])
end

def reschedule_jobs
# find and delete all scheduled jobs
Sidekiq::ScheduledSet.new
.select { |work| work.klass == 'HardWorker' }
.each(&:delete)

# add new schedule job
HardWorker.perform_in(setting.frequency.minutes)
end
end

0
ответ дан 24 марта 2018 в 04:03 Источник Поделиться