冲突delay_job / sidekiq

克诺托

我有一个同时安装了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包含方法和delayActiveRecord上的Sidekiq包含它的方法因此,当类尝试对其进行调用时,delay将查找其祖先类(包括Eigen类),并找到在ActiveRecord :: Base类中定义或包含的方法(该类是sidekiq延迟)

为什么__delay__起作用,因为别名定义了现有方法的副本,该方法是delayDelayedJob的方法,因此,当您调用该__delay__方法时,它会调用delay方法define DelayedJobinclude来Object

笔记:

虽然解决方案是一点补丁,但它可以工作。请记住,每次直接.delay方法调用都是SideKiq的delay方法,而不是DelayedJob来调用delay您一直以这种方式调用的DelayedJob方法__delay__

建议 :

就我个人而言,Monkey Patching只是一种不好的做法,我宁愿不为单个应用程序使用2个完全不同的后台处理库来完成相同的任务。如果任务是在后台处理的事情,为什么不能用一个库delayed_jobsidekiq(为什么要同时使用这两个库)来完成呢?

因此,要点和简单的事情可以使您的后台处理相对于将来更加轻松,我真诚地建议您采用两个库中的任何一个进行后台处理,我认为这将是您问题有效答案,而不是像猴子那样疯狂地修补其他问题东西

希望这个帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

delay_job丢失方法

来自分类Dev

Rspec测试delay_job

来自分类Dev

delay_paperclip没有击中sidekiq

来自分类Dev

delay_job进程默默退出

来自分类Dev

启动heroku delay_job工人

来自分类Dev

Rakefile用于Sinatra的delay_job

来自分类Dev

Heroku delay_job依赖项

来自分类Dev

为什么在delay_job中关闭了时区?

来自分类Dev

Rails:after_create回调上的delay_job?

来自分类Dev

delay_job没有看到环境变量

来自分类Dev

如何优雅地重启delay_job消费者?

来自分类Dev

避免在delay_job队列中重复工作

来自分类Dev

在视图中显示delay_job处理程序

来自分类Dev

为什么在delay_job中关闭了时区?

来自分类Dev

更新run_at以获得delay_job队列

来自分类Dev

使用delay_job和tute / merit延迟徽章分配

来自分类Dev

避免在delay_job队列中重复作业

来自分类Dev

通过delay_job将图像上传到heroku

来自分类Dev

rails docker中的delay_job无法正常工作

来自分类Dev

Sidekiq中的perfrom_async和delay有什么区别?

来自分类Dev

如何在ActiveJob中使用自定义的delay_job作业?

来自分类Dev

Rails 4-如何通过delay_job发送类似新闻通讯的电子邮件?

来自分类Dev

系统重新启动时delay_job工作的数量

来自分类Dev

Rails-异步发送所有带有delay_job的电子邮件

来自分类Dev

Thought Sphinx延迟增量可以使用命名的delay_job队列吗?

来自分类Dev

在Elastic Beanstalk上设置delay_job时如何获取修复“ require”错误

来自分类Dev

如何在Rails中使用delay_job将文件读取(导入)到数据库

来自分类Dev

如何创建带有钩子/回调的delay_job作业?

来自分类Dev

delay_job未发送电子邮件,但正在处理作业