从线程创建后台作业

时间:2016-10-30 17:21:00

标签: ruby-on-rails sidekiq puma

我有一个使用第三方服务的应用程序。我的应用程序可以为它存储在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)

1 个答案:

答案 0 :(得分:1)

使用after_commit :run_background_job