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

Dmi*_*sky 6 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
Run Code Online (Sandbox Code Playgroud)

我使用 Sidekiq 4.2.10 作为后台作业适配器。

Fab*_*eto 8

您可以使用around_enqueue来实现相同的结果而不会引发异常。当您的工作不需要排队时,这会很有用。

前任:

around_enqueue do |_job, block|
   if my_condition 
      block.call # this will enqueue your job
   end
end
Run Code Online (Sandbox Code Playgroud)

OBS:值得注意的是,此答​​案基于 Rails 5 ActiveJob 代码,但也必须适用于 Rails 4。


Ser*_*sev 1

throw :abort从您before_enqueue开始停止回调链的执行和perform

代码: https: //github.com/rails/rails/blob/fc20050ea69ba3b8d8bc90171d2dcbf93e9a1dae/activesupport/lib/active_support/callbacks.rb#L23

  • @Adeynack:是的,听起来更像是这样。:+1: (2认同)