2016-06-16 6 views
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コールバックを失います。

+0

私はClockworkに精通していませんが、抽象化のレベルを追加し、Clockworkまたはメソッド呼び出し元の他のどのインターフェイスからでも必要なメソッドを作成する必要があるようです。 'Shift.sync'を' REDIS.hset'を呼び出すメソッドにラップするか、Clockwork DSLのコマンド部分ですか? –

+0

イベントをクロックワークファイルから実行される別々のスクリプトに抽出することがあります。 –

+0

私はClockwork自体が私の抽象化レベルになると思っていましたが、すべてのレイヤーを1つにまとめる必要があるように見えます。ヒントをありがとう。 – chrismanderson

答えて

1

いいえ、これはできません。

これは、コールバックと実行設定されたイベントを処理時計仕掛けの宝石で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を実行

個々のイベントを実行して、まだすべてのコールバックが解雇持ってできるようにするには、この方法は、このような何かをchangetoする必要があります。

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に登録されているので、あなたが正しく設定で定義されたすべてのイベントで初期化されたマネージャのインスタンスが必要になります。

長い話を短くするこれは現時点では不可能であり、可能な限りコードの構造を変更する必要があります。

+0

もっと良い答えがあることを望みますが、これが答えです。ありがとう! – chrismanderson

関連する問題