我正在运行Rails 4.2.8,我想让我的工作只在某些条件下运行。目前我正在检查调用该作业的代码,但是在作业类中包含逻辑会更加清晰。有没有人这样做过?
class MyJob < ApplicationJob
before_enqueue do |job|
# check and stop job from being enqueued under certain conditions
end
def perform(args*)
# code here
end
end
我使用Sidekiq 4.2.10作为后台作业适配器。
答案 0 :(得分:2)
从before_enqueue
提出异常。来自DHH的信息:https://groups.google.com/forum/#!topic/rubyonrails-core/mhD4T90g0G4
这是故意的。我从来不喜欢在过滤器中返回false会如何停止执行。副作用太多,如
@stuff = Model.something_returning_false
,会意外停止回调链。在AJ中,如果你想要停止执行,我们会采用需要你引发异常的显式方法。我们将在其他地方改变回调,以摆脱Rails 5.0中的“虚假手段停止”。before_ *确实与在执行之前编写代码相同,但是以这种方式可以抽象和混合。所以你可以在超类中编写before_ *回调而不需要孩子调用超级,或者你混合的模块。
答案 1 :(得分:2)
您可以使用around_enqueue
来获得相同的结果而不会引发异常。如果没有排队是您工作所期望的事情,这可能很有用。
例如:
around_enqueue do |_job, block|
if my_condition
block.call # this will enqueue your job
end
end
OBS:值得注意的是,这个答案基于Rails 5 ActiveJob代码,但也必须适用于Rails 4。