Rails ActiveJob - 如何阻止作业在before_enqueue中排队

时间:2017-04-14 15:05:59

标签: ruby-on-rails redis sidekiq rails-activejob

我正在运行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作为后台作业适配器。

2 个答案:

答案 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。