使用delayed_job
,我可以执行以下简单操作:
@foo.delay.increment!(:myfield)
Rails的新ActiveJob是否可以做同样的事情?(无需创建一堆执行这些小操作的作业类)
ActiveJob只是在各种后台作业处理器之上的抽象,因此许多功能取决于您实际使用的提供者。但是,我将尽量不依赖任何后端。
通常情况下,工作提供者包括持久性机制和亚军。当卸载工作时,您以某种方式将其写入持久性机制,然后稍后一个运行者检索并运行它。所以问题是:您能否以与您需要的任何操作兼容的格式来表达您的工作数据?
然后定义什么是工作定义。例如,它可以是单个方法调用。假设这种语法:
Model.find(42).delay.foo(1, 2)
我们可以使用以下格式:
{
class: 'Model',
id: '42', # whatever
method: 'foo',
args: [
1, 2
]
}
现在,我们如何从给定的调用中构建这样的哈希并将其排队到作业队列中?
首先,看上去,我们需要定义一个类method_missing
以捕获被调用的方法名:
class JobMacro
attr_accessor :data
def initialize(record = nil)
self.data = {}
if record.present?
self.data[:class] = record.class.to_s
self.data[:id] = record.id
end
end
def method_missing(action, *args)
self.data[:method] = action.to_s
self.data[:args] = args
GenericJob.perform_later(data)
end
end
工作本身必须像下面这样重构该表达式:
data[:class].constantize.find(data[:id]).public_send(data[:method], *data[:args])
当然,您必须delay
在模型上定义宏。最好将其分解为模块,因为定义非常通用:
def delay
JobMacro.new(self)
end
它确实有一些限制:
ruby2ruby
gem做到这一点)。依靠作业提供者正确地序列化参数,如果失败,可以使用您自己的代码来帮助它。例如,在que
内部使用JSON,因此无论是在JSON中工作,还是在中工作que
。例如,符号没有。起初,事情将以惊人的方式破裂。
因此,请确保在开始之前设置调试工具。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句