【问题标题】:Delay job gem will not works in case the referred object changes its attribute如果引用的对象更改其属性,延迟作业 gem 将不起作用
【发布时间】:2012-09-13 17:16:12
【问题描述】:

我正面临一个非常有趣的问题。我已经测试了延迟作业 gem 4 次。我怀疑这是宝石的设计问题还是错误。我使用命令rake jobs:work 来创建工人来做延迟工作。

一旦我创建了一个 LongTask 记录,我也会做一个延迟作业,它将属性minutes_delayed 更改为 2。

如果我不更新属性,gem 会完美运行。但是一旦我编辑了描述,gem就不能正常工作了,这意味着它不会执行延迟作业,但是相关的延迟作业记录会在数据库中删除。

有趣的最终结果:

似乎引用了一个属性完全相同的对象,这张图片是在运行时间过去之前捕获的。

这个是在所有测试结束后捕获的。您可以看到 test4 的延迟作业记录已被删除,即使此延迟作业没有任何影响。

终端结果(只执行了 2 个作业)

[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] Starting job worker
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] LongTask#set_delay_time_without_delay completed after 0.0343
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] 1 jobs processed at 16.6270 j/s, 0 failed ...
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] LongTask#set_delay_time_without_delay completed after 0.0105
[Worker(host:Jasonteki-MacBook-Air.local pid:1726)] 1 jobs processed at 51.4774 j/s, 0 failed ...

模型中的代码:

  def set_delay_time(time)
    self.minutes_delayed = time
    # very important for this, otherwise cannot write the change into the database
    self.save
  end

  handle_asynchronously :set_delay_time, :run_at => Proc.new { 2.minutes.from_now }

控制器中的代码:

 def create
    @long_task = LongTask.new(params[:long_task])

    respond_to do |format|
      if @long_task.save
        @long_task.set_delay_time(2)

【问题讨论】:

    标签: ruby-on-rails ruby activerecord gem


    【解决方案1】:

    如果没有看到您的代码,就无法确定,但很可能您的两个延迟作业都在处理对象的序列化副本,而不是从数据库中重新加载它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-07
      • 2011-10-22
      • 1970-01-01
      • 2016-03-29
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多