延迟的工作不起作用

MrJ*_*ger 3 ruby-on-rails delayed-job mongoid

我正在构建一个应用程序,该应用程序有时需要将fb中的一堆数据与我的数据库同步,所以我(尝试)使用“延迟作业”将其推送到后台。这是我的“延迟工作”类的一部分。

class FbSyncJob < Struct.new(:user_id)
  require 'RsvpHelper'

  def perform
    user = User.find(user_id)
    FbSyncJob.sync_user(user)
  end

  def FbSyncJob.sync_user(user)
    friends = HTTParty.get(
      "https://graph.facebook.com/me/friends?access_token=#{user.fb['token']}"
    )
    friends_list = friends["data"].map { |friend| friend["id"] }
    user.fb["friends"] = friends_list
    user.fb["sync"]["friends"] = Time.now
    user.save!
    FbSyncJob.friend_crawl(user)
  end
end
Run Code Online (Sandbox Code Playgroud)

RsvpHelper班级一起生活lib/RsvpHelper.rb。因此,在我的应用程序中的某个时候,我会Delayed::Job.enqueue(FbSyncJob.new(user.id))与一个已知的有效用户进行呼叫。我建立的工作人员甚至告诉我工作已成功完成:

1 jobs processed at 37.1777 j/s, 0 failed

但是,当我在数据库中检查用户时,他的朋友列表尚未更新。我做错了什么还是什么?非常感谢您的帮助,这使我发疯。

hou*_*se9 5

Delayed::Job.enqueue 会在延迟的作业表中放置一条记录,但是您需要运行一个单独的进程来执行作业代码(执行方法)

通常在开发中是这样bundle exec rake jobs:work(注意:您在进行代码更改时必须重新启动此rake任务,它将不会自动加载更改)

在开发过程中,我通常将以下内容放入延迟的配置中-这永远不会在延迟的作业表中添加记录,并且同步(在开发中)运行所有后台代码,并且默认情况下,rails将重新加载对代码的更改

Delayed::Worker.delay_jobs = !(Rails.env.test? || Rails.env.development?)

  • 这会更容易阅读:`Delayed::Worker.delay_jobs = Rails.env.production?` (2认同)