冲突delayed_job / sidekiq

时间:2013-09-04 14:57:44

标签: ruby-on-rails delayed-job sidekiq

我有一个安装了sidekiq和延迟作业宝石的应用程序。当我在活动记录模型中触发handle_asynchronously时,它似乎由sidekiq处理,而我想触发delayed_job。

有没有办法为特定型号停用sidekiq?

2 个答案:

答案 0 :(得分:3)

更新:

Sidekiq现在提供了完全禁用其delay模块或将其别名为sidekiq_delay的方法。请检查这个以了解如何操作。 https://github.com/mperham/sidekiq/wiki/Delayed-Extensions#disabling-extensions


对于较旧版本的sidekiq:

我使用this monkey patch进行调整,以便调用.sidekiq_delay()转到sidekiq,.delay()转到DelayedJob。根据Viren的回答,我认为这也可以解决你的问题。

补丁不那么复杂(只是一堆别名),让你有能力有意识地决定你实际呼叫的delay

答案 1 :(得分:2)

正如我在评论中提到的那样为了使其正常工作,你必须重新定义/基本上修补handle_asynchronously方法,就像这样

您喜欢的任何地方(但请确保已加载)

config / initializers / patch.rb 中的

代码如下所示

module Patch
  def handle_asynchronously(method, opts = {})
    aliased_method, punctuation = method.to_s.sub(/([?!=])$/, ''), $1
    with_method, without_method = "#{aliased_method}_with_delay#{punctuation}", "#{aliased_method}_without_delay#{punctuation}"
    define_method(with_method) do |*args|
      curr_opts = opts.clone
      curr_opts.each_key do |key|
        if (val = curr_opts[key]).is_a?(Proc)
          curr_opts[key] = if val.arity == 1
            val.call(self)
          else
            val.call
          end
        end
      end
      ## Replace this with other syntax
      # delay(curr_opts).__send__(without_method, *args)
      __delay__(curr_opts).__send__(without_method, *args)
    end
    alias_method_chain method, :delay
  end
end

Module.send(:include,Patch)

我相信休息一切都将遵循它们应该的方式:)

原因:

延迟:: Job包含对象的delay方法和Sidekiq在ActiveRecord上包含delay方法 因此,当类尝试调用delay时,它会查找它的祖先类(包括Eigen类) 并且它找到定义或包含在ActiveRecord :: Base类中的方法(这是sidekiq延迟)

为什么__delay__有效,因为别名定义了现有方法的副本,即DelayedJob的delay方法,因此当您调用__delay__方法时,它会调用delay方法定义DelayedJob 包括Object

注意:

虽然解决方案是位补丁,但它的工作原理。请记住,每个直接的.delay methid调用都在调用SideKiq的delay方法,而不是DelayedJob来调用您一直称之为的{Delay} delay方法__delay__ < / p>

建议:

Monkey Patching在我个人的笔记中只是一个不好的做法我宁愿不使用2个完全不同的后台处理库来为单个应用程序实现相同的任务。如果任务是后台处理的事情,为什么不能使用单个库delayed_jobsidekiq(为什么你需要它们)

所以重点和简单的事情使您的后台处理变得轻松,我真诚地建议您将两个库中的任何一个用于后台处理,我觉得有效的答案是你的问题,而不是猴子修补做其他疯狂的东西

希望这个帮助