2016-10-30 5 views
0

私はサードパーティのサービスを使用するアプリケーションを持っています。私のアプリケーションは、DBに格納されているそのサービスの認証を作成できます。その認証は、使用されるDB内にある必要があるため、同じトランザクションでコミットすることはできません。この作業を行うために、スレッドを開いて新しいDB接続を作成し、直ちに認証レコードをコミットします。スレッドからバックグラウンドジョブを作成する

このスレッドを使用して問題が発生しているようです。スレッドがなければ、すべてのコードがスムーズに実行されます。私は認証を使用する必要があり、DBにまだ入っていないので、401が表示されます。

以下は何が起こっているかを追うことができます。ユーザーを作成すると、run_backround_jobになるまでさまざまなコールバックがトリガーされます。それはperform_laterにぶら下がっているようです。スレッドコードを削除して直ちに実行させると、すべてが機能します。しかし何らかの理由で、ジョブが別のスレッドにある場合は、ジョブをキューイングすることに固執します。

class User < ApplicationRecord 
    belongs_to :organization 

    after_create :use_auth 

    def use_auth 
    organization.find_or_create_auth 
    end 
end 

class Organization < ApplicationRecord 
    has_many :authentications 
    has_many :users 

    def find_or_create_auth 
    Thread.new do 
     ApplicationRecord.connection_pool.with_connection do 
     authentications.find_or_create_by(name: name) 
     end 
    end.join.value 
    end 
end 

class Authentication < ApplicationRecord 
    belongs_to :organization 

    after_create :run_background_job 

    def run_background_job 
    AuthBackgroundJob.perform_later(id) 
    end 
end 

レール(5.0.0) PUMA(3.6.0) sidekiq(4.1.4)

答えて

1

使用after_commit :run_background_job

はここで何が起こっているかを表すコードです。

+0

これは動作するようです!しかし、私にはそれほど奇妙ではありませんでした。 –

+0

https://github.com/mperham/sidekiq/wiki/FAQ#why-am-i-seeing-a-lot-of-cant-find-modelname- with-id12345-errors-with-sidekiq –

関連する問題