2016-07-11 4 views
2

:非同期キューアダプタは実際に何かを行いますか?Rails非同期アクティブジョブはコードを実行しませんが、インラインは実行します

:Rails 4のデフォルトであるinlineは、ActiveJobで構築されたジョブ(現行の実行スレッド内のUh ...インライン)を処理します。非同期ではありません。 ConnectionPoolを使用して現在のスレッドで実行しないと、理想的には何が起きているのでしょうか。現在の実行スレッドの外側で実行されます。

しかし、それを実行するものはありません。

私はドキュメントを徹底的に吟味しました。私が考えることができるのは、asyncはインラインで、タスクを実行せず、ローカルで実行するシステムを構築することを期待しています。ローカルで実行させるには、すべてのジョブで手動でperformを実行する必要があります。アダプタをインラインに設定すると、実行せずに正常に動作します。

非同期が正常に動作しないように設定されています(ActionCableなど)。

レーキタスク(またはコンソール?)から実行すると機能しません。

これはうまく動作します:sidekiq /:resqueですが、これらはローカルでは常に実行したくありません。

Rails by default comes with an "immediate runner" queuing implementation. That means that each job that has been enqueued will run immediately.

これは、そこに何かが間違っている私をキューイング何の一種です。私はちょうど実行しないキューの中に座っているジョブを持っています。何がこれを止めることができますか?

答えて

4

これは私が発見したものです。並行ルビの出現により、レーキタスクはこれを処理するように設定されていません。

ドキュメントを読むと、:asyncと表示され、プロセスが終了するとメモリが空になります。

Rails自体はインプロセスのキューイングシステムしか提供していません。これは しかRAMにジョブを保持しません。プロセスがクラッシュした場合、またはマシンがリセットされた場合、 デフォルトの非同期バックエンドですべての未処理ジョブが失われます。

レイクプロセスが終了すると終了します。したがって、データの変更を行っている場合は、ジョブを実行するのに十分な時間が開いていないため、:inlineを実行しても、:asyncではありません。

だから、何かを実行するのに十分な時間をかけてレーキタスクを開いたままにしておくという解決策を見つけられませんでした(そして、アプリケーション全体を:asyncのままにしておきます)。私は仕事を実行するためにそれを:inlineに変えなければなりません。そして残りの仕事を終えたら:asyncに戻ります。それは、:sidekiqまたは:resqueで正常に動作する理由です。これらのアプリケーションは、ジョブ情報をメモリに保持し、レーキタスクが終了しても解放しないためです。

すくいタスクをローカル:asyncで動作するためには、多くのローカルなら(タスクランナーなど)熊手は非同期タスクがされている間、開いたままにする方法を理解するまで、あなたは:inlineとして実行タスク以外行うことができますがありません開始した(またはしなかった)。開発のための機能として、これはあまり優先度が高いわけではありませんが、ジョブを実行するデフォルトのタスクでなぜ:asyncが実際には実行されないのか理解できない場合は、

+0

@januszmうれしい少し助けを得ることができました。 – tadiou

関連する問題