【问题标题】:Do I need to put everything in app/workers for sidekiq?我是否需要将所有内容都放在 sidekiq 的 app/workers 中?
【发布时间】:2019-12-20 22:48:25
【问题描述】:

我目前正在从 DJ 迁移到 sidekiq,并且有很多普通的旧 ruby​​ 对象,我会像这样使用:

Delayed::Job.enqueue(SomeService.new(id))

我以为我可以将SomeService 移动到app/workers 文件夹并添加include Sidekiq::Worker,但它永远不会进入sidekiq 队列,只是当场调用执行

class SomeService
  include Sidekiq::Worker

  def initialize(id)
    @some_instance = SomeClass.find_by(id: id)
  end 

  def perform
    @some_instance.do_something
  end
end

所以我必须创建一个 sidekiq worker 来调用服务

class SomeServiceWorker
  include Sidekiq::Worker

  def perform(id)
    SomeService.new(id).perform
  end
end

有没有办法只使用 SomeService,它包含一个初始化方法和执行方法,所以我不必创建一个工作人员来调用我的服务对象?

【问题讨论】:

  • 对不起,Workers 必须有一个空的初始化方法。参数进入perform。 ActiveJob 也是一样。

标签: ruby-on-rails ruby sidekiq


【解决方案1】:

你做的只有一个错误,你忘记在第一个文件的类名中添加“工人”字样!

class SomeServiceWorker
  include Sidekiq::Worker

  def initialize(id)
    @some_instance = SomeClass.find_by(id: id)
  end 

  def perform
    @some_instance.do_something
  end
end

这段代码会运行你的worker

SomeServiceWorker.new(id).perform

【讨论】:

  • 这是不正确的。 Sidekiq Worker 可以命名任何东西,但它们必须包含 Sidekiq::Worker,有一个空的初始化方法和一个带有任何必要参数的 perform 方法。
  • @MikePerham by empty initialize 方法,你的意思是根本没有初始化方法,还是没有参数?
  • 我的意思是没有争论。
【解决方案2】:

Sidekiq 不太关心文件的位置和/或它们的命名方式,只要它们包含 Sidekiq::Worker。不过,惯例是将所有工作人员放在app/workers 目录中,并将它们命名为MyWorker

然后您可以将它们称为:

MyWorker.perform_async params

【讨论】:

    【解决方案3】:

    这些不会是后台作业:

    # This won't do
    SomeWorker.new(*args).perform
    # This is also won't do
    SomeWorker.new.perform(*args)
    

    你必须使用 perform 而不创建类实例:

    # This is correct:
    SomeWorker.perform_async(*args)
    # This is also correct:
    Sidekiq::Client.push('class' => SomeWorker, 'args' => *args)
    

    所以,sidekiq worker 中不能有初始化方法。

    假设这些是您唯一的代码,那么:

    class SomeServiceWorker
      include Sidekiq::Worker
    
      def perform(id)
        some_instance = SomeClass.find(id)
        some_instance.do_something
      end
    end
    

    如果 SomeService 实际上更复杂,最好的做法是做你该做的:

    class SomeServiceWorker
      include Sidekiq::Worker
    
      def perform(id)
        SomeService.new(id).perform
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 2023-02-15
      • 2021-10-23
      • 2018-12-14
      • 2015-12-07
      相关资源
      最近更新 更多