私はバックグラウンドジョブに Sidekiq を使用しています:
ワーカーアプリ/workers/data_import_worker.rbがあります
class DataImportWorker
include Sidekiq::Worker
sidekiq_options retry: false
def perform(job_id,file_name)
begin
#Some logic in it .....
end
end
ファイルから呼び出されますlib/parse_Excel.rb
def parse_raw_data
#job_id and #filename are defined bfr
DataImportWorker.perform_async(job_id,filename)
end
アクションからトリガーするとすぐに、ワーカーが呼び出されません。Redisはlocalhost:6379
で実行されています。
なぜこれが起こっているに違いないのか考えてみてください。環境はLinuxです。
Sidekiqが実行されている場合にも同様の問題が発生しましたが、perform_async
return true
以外は何もしませんでした。
問題はrspec-sidekiqが私の ":development、:test"グループに追加されたことでした。 rspec-sidekiqを ":test"グループのみに移動することで問題を修正しました。
Railsアプリのルートディレクトリからsidekiqを起動します。たとえば、
bundle exec sidekiq -e staging -C config/sidekiq.yml
これで良い15分を失った。 Sidekiqが(キュー名を含む)構成ファイルを正しくロードしているかどうかを確認するには、[ビジー]タブのWebインターフェイスに移動すると、プロセスIDが表示され、その下にキューが表示されます。
私たちの場合、mailer
のつづりを間違えました(メーラーの正しいActiveJobキューは複数形でmailers
です)。
ワーカーの対象となるキューの名前を指定する必要があります。
例:sidekiq_options再試行:false、:queue => data_import_worker
data_import_workerには、任意の名前を付けることができます。
次に、Webインターフェイスyoursite.com/sidekiqにアクセスすると、キュー「data_import_worker」の現在のワーカーを確認できます。
同じ問題が発生しました。関数perform_asyncで渡した引数が適切ではないことがわかりました。perform_asyncでクエリ結果を渡すべきではないようです。関数performですべてのクエリを実行する必要があります。
私にとってperform_laterを実行すると、キューに入れられますが、キューから削除されることはありません。キュー名をsidekiq.ymlファイルに追加する必要がありました
---
:concurrency: 25
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:queues:
- default
- my_queue
スタンドアロンのsidekiqで実際に複数のワーカーを実行していますか?たとえば、2人のワーカーがいます:ProccessWorker CallbackWorker
私がsidekiqを実行しているとき:bundle exec sidekiq -r ./workers/proccess_worker.rb -C ./config/sidekiq.yml
同時に1人の労働者だけ。
私の問題は、単にワーカーファイルが間違ったパスにあることでした。
「project_root/worker /worker.rb」ではなく「project_root/app/worker /worker.rb」にある必要があります
ファイルパスを確認してください!
本番コンソールでperform_async(23)
を呼び出していましたが、sidekiqがステージングモードで開始されました。
Sidekiqを本番モードで開始した後、物事は非常にうまく機能し始めました。