【问题标题】:Scheduler Job not running in Rails 4调度程序作业未在 Rails 4 中运行
【发布时间】:2017-02-23 07:03:20
【问题描述】:

我有一个 Rails 应用程序,其中将订单分配给供应商,供应商必须在接下来的 15 分钟内接受订单(出于测试目的,我将其保持在两分钟内)。一旦将订单分配给供应商,订单和供应商的订单分配表中的状态属性更新为已分配。现在供应商必须接受或拒绝订单,根据该订单状态分别更新为接受和拒绝。如果供应商在分配后的 15 分钟内未接受/拒绝订单,则订单分配表中的状态将自动更新为已拒绝。这是sn-ps

OrderAssignment 模型:

class Estamps::OrderAssignment < ActiveRecord::Base
belongs_to :vendor, class_name: 'Estamps::Vendor'
belongs_to :order, class_name: 'Estamps::Order'
belongs_to :status, class_name: 'Estamps::OrderAssignments::Status'


after_save :enqueue_check_status 

def enqueue_check_status 
   AutoRejectionJob.set(wait: 2.minutes).perform_later(self.id)
   if self.status_id == 3
    OnRejectionJob.perform_later(self.id)
   end
end

end

订购型号:

has_many :order_assignments
belongs_to :vendor

供应商型号:

has_many :order_assignments
has_many :orders

Auto_rejection_job

class AutoRejectionJob < ActiveJob::Base
queue_as :auto_rejection

def perform(order_assignment_id)
    order_assignment = Estamps::OrderAssignment.find(order_assignment_id) 
    if order_assignment 
         if order_assignment.status_id == 1 
             order_assignment.update_attribute('status_id', '3')
             order_assignment.save!
         end  
    end
end
end         

OrderAssignment 架构:

 create_table "estamps_order_assignments", force: :cascade do |t|
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.integer  "vendor_id"
  t.integer  "order_id"
  t.integer  "status_id"
 end

这里的 status_id 来自另一个包含各种状态的表。

现在在创建订单分配记录后,初始分配状态(status_id: 1),如果供应商不更新状态,则 status_id 自动更新为 status_id:3(rejected)。我尝试在 auto_rejection_job 中实现这一点。但是,尽管作业显示为已入队,但 status_id 并未更新。当我在控制台上以

身份运行该作业时,该作业确实运行正常
AutoRejectionJob.set(wait: 2.minutes).**perform_now**(an id), 

然后 status_id 已更新,但在指定的预定时间不起作用。我哪里出错了?我怎样才能做到这一点? Rails 新手,请帮忙。

【问题讨论】:

  • 你不必在update_attribute之后保存模型。
  • @AleksanderLopez - 我会编辑,谢谢。你能帮我解决主要问题吗?

标签: ruby-on-rails ruby jobs resque-scheduler


【解决方案1】:

我的猜测是你还没有启动工作进程。如http://edgeguides.rubyonrails.org/active_job_basics.html 中所述,您可以配置一堆不同的队列后端。

如果你想使用 Sidekiq,请添加 sidekiq gem

gem 'sidekiq'

运行 'bundle' 进行安装

设置sidekiq为后端

# config/application.rb
module YourApp
  class Application < Rails::Application
    # Be sure to have the adapter's gem in your Gemfile
    # and follow the adapter's specific installation
    # and deployment instructions.
    config.active_job.queue_adapter = :sidekiq
  end
end

你需要让 sidekiq 在你的 Rails 服务器旁边运行

$ bundle exec sidekiq

【讨论】:

  • 实际上,我确实有 resque_scheduler 在我的服务器旁边运行
  • 那你能把resque日志贴出来吗?
  • 我尝试使用 sidekiq gem 并按照您提到的相同步骤操作。不过那里似乎没有任何改变。
  • 我检查了我的 resque 日志,那里根本没有调用 auto_rejection_job。我也有 redis-server 和它一起运行
  • 仍然认为 resque 日志非常适合用于调试。 - 您是否有其他工作正在运行,或者这是第一个添加的? - 你指定你的 queue_adapter 了吗?
猜你喜欢
  • 1970-01-01
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2018-02-24
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多