早些时候,我发布了这个问题,并认为它已经解决了:
Rails background worker always fails first time, works second
但是,在继续测试和开发之后,错误再次出现,但方式略有不同。
我使用Sidekiq ( Rails 3.2.8,Ruby1.9.3)运行后台进程after_save。下面是我的模型、工作人员和控制器的代码。
型号:
class Post < ActiveRecord::Base
attr_accessible :description,
:name,
:key
after_save :process
def process
ProcessWorker.perform_async(id, key) if key.present?
true
end
def secure_url
key.match(/(.*\/)+(.*$)/)[1]
end
def nonsecure_url
key.gsub('https', 'http')
end
end
工人:
class ProcessWorker
include Sidekiq::Worker
def perform(id, key)
post = Post.find(id)
puts post.nonsecure_url
end
end
(更新)主计长:
def create
@user = current_user
@post = @user.posts.create(params[:post])
render nothing: true
end
每当首次分派作业时,无论采用何种方法,作业最初都会失败:
undefined method `gsub' for nil:NilClass
然后,他们总是成功的第一次重试。
我遇到了以下github问题,这个问题似乎已经得到解决--与这个问题有关:
https://github.com/mperham/sidekiq/issues/331
在这里,人们说,如果他们创建初始化器来初始化模型上的ActiveRecord方法,那么它就解决了他们的问题。
为了实现这一点,我尝试在lib/initializers中创建一个名为sidekiq.rb的初始化器,并使用以下方法来初始化Post模型上的方法:
Post.first
现在,第一个创建的作业第一次成功完成。这很好。然而,第二次创建的作业第一次失败-并且在重试时完成.让我回到我开始的地方。
这真的让我大吃一惊--有人也有过同样的问题吗?任何帮助都是非常感谢的。
发布于 2013-12-31 14:03:04
将模型回调从after_save
更改为用于create
操作的after_commit
。有时,sidekiq可以在模型实际完成对数据库的保存之前初始化您的工作人员。
after_commit :process, :on => :create
https://stackoverflow.com/questions/20861526
复制相似问题