質問

Railsでdelayed_jobプラグインを使用してバックグラウンド処理を行っていますが、これまでRailsで経験してきた「アジャイル開発」で問題が発生しています...

通常、エラーが発生した場合、またはいくつかの新しい機能を追加したい場合はレールで-コードを追加してページを更新すると、新しいコードが実行されます。

delayed_jobでは、ジョブクラスがリロードされていないようです...ジョブが失敗し、エラーを修正してジョブを再度実行すると、古いコードが再び実行されます。

delayed_jobを呼び出す前に最新バージョンのジョブクラスをロードする方法はありますか?

これが何か関係がある場合のために-delay_jobには、ジョブの宣言/ジョブの実行方法にいくつかの異なるオプションがあることを知っています:

私のジョブクラスはRailsのlibディレクトリにあり、次のように宣言されています:

class FooJob < Struct.new(:foo_id)

コントローラからこのようなジョブを呼び出しています:

Delayed::Job.enqueue(FooJob.new(params[:id]))
役に立ちましたか?

解決

これを行うための組み込み機能はありません。一般的に、あなたはあなたの労働者を管理し、リロードする責任があります。 Rails開発のリロードは良好ですが完璧ではないため、これもおそらく同じです。遅延ジョブを自動リロードしようとすると、ワーカープロセス内でデバッグするのが非常に不透明なあらゆる種類の微妙な問題が発生する可能性があります。また、すべてのジョブの環境を自動的にリロードすると、多くのユースケースが開発モードで非常に遅くなります。

提案するのは、変更を加えるときに rake jobs:work を実行し、次に Ctrl-C を実行することです。または、アドホックベースで手動でジョブを実行するだけのスクリプトを作成できます( delayed_job docs ):

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/environment'

Delayed::Worker.new.start  

他のヒント

私はこのハックを使用して非常にうまく動作しますが、おそらく非常にRailsとdelayed_jobのバージョン固有であるため、何かを変更する必要があることに注意してください。 Rails 3.2.0およびdelayed_job 2.1.4でテスト済み

これを例えば script / delayed_job_development をRailsルートから実行します。

#!/usr/bin/env ruby

require File.expand_path('../config/environment', File.dirname(__FILE__))
require 'delayed/worker'
require "rails/console/app"

class DummyConsoleClass
  include Rails::ConsoleMethods
end
dummy_console = DummyConsoleClass.new

worker = Delayed::Worker.new({:quiet => false})

puts "Waiting for jobs..."
loop do
  if Delayed::Job.find_available(worker.name).count > 0
    puts "Found jobs"
    dummy_console.reload!
    loop do
      break if worker.work_off.sum == 0
    end
    puts "Done, waiting for jobs..."
  end
  sleep(2)
end

これが非常に悪いアイデアまたは注意すべきことであることがわかっている場合はコメントしてください、私は主に、将来実行される予定のジョブではなく、すぐに実行されるジョブを編集およびテストするときに使用します

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top