Как я могу запустить заводную работу вручную?
Название говорит обо всем на самом деле.
Можно ли запускать заводные задания вручную? Например, если у меня есть 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
вам понадобится экземпляр менеджера, который правильно инициализируется со всеми событиями, определенными в конфигурации.
Короче говоря, в данный момент это невозможно, и для этого потребуется много изменений в структуре кода.