我怎样才能 运行 手动发条工作?
How can I run a Clockwork job manually?
标题说明了一切。
是否可以手动 运行 发条作业?例如。如果我有一个 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 回调。
不,这不可能。
这是时钟装置 gem 中的 relevant method,它处理回调和 运行s 配置的事件:
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
中的所有事件并触发回调和 运行s the 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
中注册的,因此您需要一个管理器实例,该实例已使用配置中定义的所有事件正确初始化。
长话短说:目前这是不可能的,需要对代码结构进行许多更改才能实现。
标题说明了一切。
是否可以手动 运行 发条作业?例如。如果我有一个 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 回调。
不,这不可能。
这是时钟装置 gem 中的 relevant method,它处理回调和 运行s 配置的事件:
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
中的所有事件并触发回调和 运行s the 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
中注册的,因此您需要一个管理器实例,该实例已使用配置中定义的所有事件正确初始化。
长话短说:目前这是不可能的,需要对代码结构进行许多更改才能实现。