【问题标题】:How can I run a Clockwork job manually?如何手动运行 Clockwork 作业?
【发布时间】:2016-10-18 09:55:12
【问题描述】:

标题说明了一切。

是否可以手动运行 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 回调。

【问题讨论】:

  • 我不熟悉 Clockwork,但似乎您需要添加一个抽象级别,并通过 Clockwork 或您希望从中调用方法的任何其他接口使您需要的方法可用。您能否将Shift.sync 包装在一个也调用REDIS.hset 的方法中,或者该命令是Clockwork DSL 的一部分?
  • 也许将您的事件提取到从发条文件运行的单独脚本中。
  • 我希望 Clockwork 本身是我的抽象级别,但看起来我需要将它全部包裹一层。感谢您的提示。

标签: ruby-on-rails ruby clockwork


【解决方案1】:

不,这是不可能的。

这是发条 gem 中的 relevant method,它处理回调并运行配置的事件:

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 中注册的,因此您需要一个管理器实例,该实例使用配置中定义的所有事件正确初始化。

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

【讨论】:

  • 我希望有更好的答案,但这就是答案。谢谢!
猜你喜欢
  • 2015-04-27
  • 2012-09-14
  • 2017-01-18
  • 2014-12-05
  • 1970-01-01
  • 2018-10-01
  • 2017-09-07
  • 2022-10-23
  • 1970-01-01
相关资源
最近更新 更多