【问题标题】:Creating a background job from a thread从线程创建后台作业
【发布时间】:2016-10-31 02:01:31
【问题描述】:

我有一个使用第三方服务的应用程序。我的应用程序可以为其存储在数据库中的该服务创建身份验证。该身份验证不能在同一个事务中提交,因为它需要在数据库中才能使用。为了完成这项工作,我打开一个线程来创建一个新的数据库连接并立即提交身份验证记录

我似乎在使用这个线程时遇到了问题。没有线程,所有代码都运行顺利,一切正常,直到我必须使用身份验证,然后我得到一个 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) 彪马 (3.6.0) sidekiq (4.1.4)

【问题讨论】:

    标签: ruby-on-rails sidekiq puma


    【解决方案1】:

    使用after_commit :run_background_job

    【讨论】:

    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多