0

我面临一个非常有趣的问题。我已经测试了延迟作业 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)
4

1 回答 1

0

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

于 2012-09-13T17:24:51.193 回答