1

Rails 5.1.4サーバ(Puma v。3.10.0シングルモード)を実行していますが、正しくエンキューされる特定のActionJobに問題があります。実行されます。Rails 5.1 ActiveJob on Pumaが特定のエンキュージョブを実行していない

私はいくつかの仕事をしています。特定のジョブを除くすべてのジョブは、エンキューした直後に期待どおりに非同期に実行されます。

初めてサーバーを再起動した後、特定のジョブは新しいキューイングの後に正しく実行されます。しかし、最初の成功した実行後、それはエンキューすることに続いて実行されません。

私はすべてのジョブを一般にperform_laterでキューに入れています。

rails consoleを使用して、特定のジョブのキューイングをテストしました。コンソールにキューイングするたびに、即座に実行されます。同じセッションでさえrails serverにキューイングされるときにアプリケーションで使用されているのと同じ引数で試してみましたが、サーバーではキューに入れられます。決して実行されません。

私はログファイルをチェックしました。何もない、エラーはありません、致命的ではない、警告はありません。単に[ActiveJob] Enqueued FooBaaJobと記載していますが、ジョブを実行することはありません。

ジョブが実際に失敗した場合でも、少なくともログには[ActiveJob] [FooBaaJob] [id] Performing FooBaaJobを書き出す必要がありますが、それはできません。 そして、https://github.com/rails/rails/blob/master/activejob/lib/active_job/logging.rb#L78は、実際に失敗した場合に例外をキャッチしてログに記録する必要があります。第二に、コンソールで実行することは決してできないので、そうではないはずです。

どこから見たらいいですか?

+1

開発環境に合わせてジョブキューがどのように設定されていますか? –

+0

'async'(デフォルト - 明示的に設定されていません)と' default'キュー内のすべてのジョブ。ジョブ・キュー 'inline'を実行しようとするたびに、ジョブは常に正常に実行されます。 – mtrolle

+0

そして、あなたは1つのスレッドしか許さない設定をPumaに渡していますか? 'async'が新しいスレッドを生成するので、これはおそらくあなたの問題でしょうか? –

答えて

1

さて、この問題をデバッグする方法を見つけました。この行でconfig/initializersで初期化ファイルを作成することで

Concurrent.use_stdlib_logger(Logger::DEBUG)

は、私は今、私のコンソールにエラーデータの出力を取得します。

[ActiveJob] Enqueued FooBaaJob (Job ID: ...) to Async(default) with arguments: #<GlobalID:0...0 @uri=#<URI::GID gid://test-app/FooBaa/8>> 
[2017-10-29 16:10:56.676] DEBUG -- : Error while trying to deserialize arguments: Couldn't find FooBaa with 'id'=8 (ActiveJob::DeserializationError) 

2行目は、Concurrent.use_stdlib_logger(Logger::DEBUG)イニシエータファイルを加算した結果です。

私の場合、私は私のモデルでafter_createで仕事を開始していると私は、ジョブ実行を推測しているが、レコードの結果は完全にsqliteのDBにコミットまだときActiveJobされていないことを、方法で瞬時に起こりますそれをロードしようとしています。これはMySQLでも同様にテストされました。

Rails 5.0がafter_[create|update|destroy]_commitを導入しましたので、私の問題を修正した私のafter_createafter_create_commitに変更したところ、私は試行するたびに期待通りに動作しています。

以前のバージョンのRailsではafter_commiton: :create引数を付けて移動できました。

関連する問題