我有一个同时安装了sidekiq和延迟作业gem的应用程序。当我在活动记录模型中异步触发handle_asynchronous时,它似乎由sidekiq处理,而我想触发delay_job。
有没有一种方法可以停用特定型号的sidekiq?
正如我在评论中提到的那样,为了使其正常工作,您必须重新定义/基本上像猴子那样修补该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)
而且我相信所有的休息都会跟随他们,然后他们应该这样做:)
delay
在Object上的Delayed :: Job包含方法和delay
ActiveRecord上的Sidekiq包含它的方法因此,当类尝试对其进行调用时,delay
将查找其祖先类(包括Eigen类),并找到在ActiveRecord :: Base类中定义或包含的方法(该类是sidekiq延迟)
为什么__delay__
起作用,因为别名定义了现有方法的副本,该方法是delay
DelayedJob的方法,因此,当您调用该__delay__
方法时,它会调用delay
方法define DelayedJob
include来Object
虽然解决方案是一点补丁,但它可以工作。请记住,每次直接.delay
方法调用都是SideKiq的delay
方法,而不是DelayedJob来调用delay
您一直以这种方式调用的DelayedJob方法__delay__
就我个人而言,Monkey Patching只是一种不好的做法,我宁愿不为单个应用程序使用2个完全不同的后台处理库来完成相同的任务。如果任务是在后台处理的事情,为什么不能用一个库delayed_job
或sidekiq
(为什么要同时使用这两个库)来完成呢?
因此,要点和简单的事情可以使您的后台处理相对于将来更加轻松,我真诚地建议您采用两个库中的任何一个进行后台处理,我认为这将是您问题的有效答案,而不是像猴子那样疯狂地修补其他问题东西
希望这个帮助
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句