Rails / delayed_job-最新バージョンのジョブクラスをロードしたい
-
05-07-2019 - |
質問
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
これが非常に悪いアイデアまたは注意すべきことであることがわかっている場合はコメントしてください、私は主に、将来実行される予定のジョブではなく、すぐに実行されるジョブを編集およびテストするときに使用します