Как я могу запустить заводную работу вручную?

Название говорит обо всем на самом деле.

Можно ли запускать заводные задания вручную? Например, если у меня есть clock.rb файл

module Clockwork
  every(15.minutes, 'api.sync_shifts') do
    Shift.sync
  end

  on(:after_run) do |event, t|
    REDIS.hset("clockwork:last_run", event.job, t)
  end
end

Я хотел бы иметь возможность назвать что-то вроде Clockwork.run('api.sync_shifts'),

Я просмотрел часовой механизм и ничего полезного не увидел. Очевидно, я могу запустить, в этом примере, Shift.sync метод вручную, но тогда я потеряю свои обратные вызовы after_run/before_run, которые я использую для контроля своих рабочих статусов.

1 ответ

Решение

Нет, это невозможно.

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

def tick(t=Time.now)
  if (fire_callbacks(:before_tick))
    events = events_to_run(t)
    events.each do |event|
      if (fire_callbacks(:before_run, event, t))
        event.run(t)
        fire_callbacks(:after_run, event, t)
      end
    end
  end
  fire_callbacks(:after_tick)
  events
end

Этот метод загружает все события, которые должны запускаться в текущий момент времени (возвращается из events_to_run метод). Он перебирает все события в events_to_run и запускает обратные вызовы и запускает event,

Чтобы иметь возможность запускать отдельные события и при этом запускать все обратные вызовы, этот метод должен измениться на что-то вроде этого:

def tick(t=Time.now)
  if (fire_callbacks(:before_tick))
    events = events_to_run(t)
    events.each do |event|
      run_event_with_callbacks(event)
    end
  end
  fire_callbacks(:after_tick)
  events
end

def run_event_with_callbacks(event)
  if (fire_callbacks(:before_run, event, t))
    event.run(t)
      fire_callbacks(:after_run, event, t)
    end
  end
end

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

def load_event(job)
  # finds only the first event when there are multiple 
  # events registered for the same job
  @events.find { |event| event.job == job }
end

Но так как события зарегистрированы в Managerвам понадобится экземпляр менеджера, который правильно инициализируется со всеми событиями, определенными в конфигурации.

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

Другие вопросы по тегам