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

いいえ、これは不可能です。

これは、コールバックを処理し、構成されたイベントを実行する、clockwork 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

しかし、イベントは に登録されているためManager、config.xml で定義されたすべてのイベントで正しく初期化されたマネージャのインスタンスが必要になります。

簡単に言うと、これは現時点では不可能であり、それを可能にするにはコードの構造に多くの変更が必要です。

于 2016-07-21T09:52:16.347 に答える