1

标题真的说明了一切。

是否可以手动运行 Clockwork 作业?例如,如果我有一个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 回调。

4

1 回答 1

2

不,这是不可能的。

这是发条 gem 中处理回调和运行配置事件的相关方法:

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

但是由于事件是在 a 中注册的Manager,因此您需要一个管理器的实例,该实例已使用配置中定义的所有事件正确初始化。

长话短说:目前这是不可能的,并且需要对代码结构进行许多更改才能使其成为可能。

于 2016-07-21T09:52:16.347 回答