为什么不延迟工作流程排队工作?

时间:2014-12-19 10:55:31

标签: ruby-on-rails ruby-on-rails-4 delayed-job

我尽可能地剥夺了我的榜样。在我的应用程序中,我创建了一个虚拟类,并尝试将调用方法排入队列。这会被添加到数据库中,并且在后台运行delayed_jobs,它会将其选中并将其更新为锁定状态。但它实际上并没有完成这项工作。它只是处于锁定状态。

pry(main)> class DummyClass
pry(main)*   def self.call
pry(main)*     puts 'will this ever work?'
pry(main)*   end
pry(main)* end
=> :call

pry(main)> DummyClass.delay.call

(0.2ms)  BEGIN
SQL (0.3ms)  INSERT INTO `delayed_jobs` (`created_at`, `handler`, `queue`, `run_at`, `updated_at`) VALUES ('2014-12-19 12:11:40.006107', '--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/class \'DummyClass\'\nmethod_name: :call\nargs: []\n', 'default', '2014-12-19 12:11:40.005811', '2014-12-19 12:11:40.006107')
(16.2ms)  COMMIT

=> #<Delayed::Backend::ActiveRecord::Job:0x007fd0fdec0e20
 id: 22,
 priority: 0,
 attempts: 0,
 handler: "--- !ruby/object:Delayed::PerformableMethod\nobject: !ruby/class 'DummyClass'\nmethod_name: :call\nargs: []\n",
 last_error: nil,
 run_at: Fri, 19 Dec 2014 14:11:40 CAT +02:00,
 locked_at: nil,
 failed_at: nil,
 locked_by: nil,
 queue: "default",
 created_at: Fri, 19 Dec 2014 14:11:40 CAT +02:00,
 updated_at: Fri, 19 Dec 2014 14:11:40 CAT +02:00>

在此处锁定任务

  SQL (0.8ms)  UPDATE `delayed_jobs` SET `delayed_jobs`.`locked_at` = '2014-12-19 12:17:20.031925', `delayed_jobs`.`locked_by` = 'delayed_job host:Ryan-Mes-MacBook-Pro-2.local pid:60080' WHERE ((run_at <= '2014-12-19 12:17:20.031003' AND (locked_at IS NULL OR locked_at < '2014-12-19 12:12:20.031154') OR locked_by = 'delayed_job host:Ryan-Mes-MacBook-Pro-2.local pid:60080') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1

然后它就会挂起。我不明白为什么这么简单的任务无效。

请注意,此pry控制台正在我现有的rails应用程序上运行。它可能是应用程序配置问题,但我无法找到它。

有什么想法吗?我可以尝试提供更多信息,但我认为这就是一切。

我使用的实际代码位于

之下
module Events
  class ForwardRequestToPulse
    def self.call
      puts 'will this ever work'
    end
  end
end

class MyTestController < ApplicationController
  def index
    Events::ForwardRequestToPulse.delay.call
  end
end

该记录被添加到delayed_jobs表中。当我运行bin/delayed_job run时,记录被锁定但未被处理。

以下是锁定记录的图像 Locked record in database

2 个答案:

答案 0 :(得分:4)

我对Sidekiq比较熟悉,但我认为问题在于你定义了一个在rails控制台中运行的类,而工作者是在一个单独的进程中运行的。工作人员不知道DummyClass并且无法执行该作业。我建议:

  1. 将此类设为Rails模型(Dummy等)
  2. 重新启动延迟作业
  3. 将记录插入delayed_job表
  4. 检查锁定状态

答案 1 :(得分:1)

在宝石中摆弄后,我将问题缩小到delayed_job,没有正确查找锁定的记录。在locked_at的过滤器中包含毫秒。 mySql存储没有毫秒的日期时间,因此没有任何东西被拾取。在github delayed_job_active_record中对gem进行了一些研究之后(我认为问题就在于我!)我找到了这个fix。这解决了我的问题。

它发生在我身上的原因是我在此修复之前引用了最新的gem 4.0.2!只是我的运气。

因此,如果您使用4.0.2 ...只需升级即可消失。