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