我有一个使用第三方服务的应用程序。我的应用程序可以为它存储在DB中的服务创建身份验证。该身份验证无法在同一事务中提交,因为它需要在要使用的数据库中。为了使这项工作,我打开一个线程来创建一个新的数据库连接并立即提交认证记录
我似乎通过使用此线程遇到了问题。没有线程,所有代码都运行顺畅,一切正常,直到我必须使用auth,然后我得到一个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
rails(5.0.0) 美洲狮(3.6.0) sidekiq(4.1.4)
答案 0 :(得分:1)
使用after_commit :run_background_job
。