我目前正在从DJ迁移到sidekiq并且有许多普通的旧红宝石对象,我会这样使用:
Delayed::Job.enqueue(SomeService.new(id))
我以为我可以将SomeService
移动到app/workers
文件夹并添加include Sidekiq::Worker
但它不会进入sidekiq队列而只是调用当场执行
class SomeService
include Sidekiq::Worker
def initialize(id)
@some_instance = SomeClass.find_by(id: id)
end
def perform
@some_instance.do_something
end
end
所以我必须创建一个sidekiq工作者来调用该服务
class SomeServiceWorker
include Sidekiq::Worker
def perform(id)
SomeService.new(id).perform
end
end
有没有办法只使用SomeService,它包含一个初始化方法和执行方法,所以我不必创建一个工作者来调用我的服务对象?
你做的只有一个错误,你忘记在第一个文件中的类名中添加“工人”字样!
class SomeServiceWorker
include Sidekiq::Worker
def initialize(id)
@some_instance = SomeClass.find_by(id: id)
end
def perform
@some_instance.do_something
end
end
这段代码将运行您的工作人员
SomeServiceWorker.new(id).perform
Sidekiq并不关心文件的位置和/或它们的命名方式,只要它们包含Sidekiq::Worker
即可。但是,惯例是将所有工作者放在app/workers
目录中并将它们命名为MyWorker
。
然后您可以将它们称为:
MyWorker.perform_async params