Rails - 为什么我在工作中得到一个未定义的方法 `request` 方法 - Sidekiq

Rails - Why am I getting an undefined method `request` method within a work - Sidekiq

我创建了一个模块:

module DomainSystem

  def set_db
    @domain = request.domain
    ...
  end
  ...

end

我在 Worker 中包含的内容:

class InvoiceSchedulerWorker

    include Sidekiq::Worker
    include Sidetiq::Schedulable
    include DomainSystem

    recurrence { daily }

    def perform
      @var = set_db
      ...
    end

现在每当我调用这个 schedule worker 时我都会得到一个错误:

    2015-09-29T10:04:57.108Z 7998 TID-ow95f5gng WARN: {"class"=>"InvoiceSchedulerWorker", "args"=>[], "retry"=>true, "queue"=>"default", "jid"=>"557fb942292b0d7e72043d74", "created_at"=>1443438228.0314932, "enqueued_at"=>1443521097.099235, "error_message"=>"undefined local variable or method `request' for #<InvoiceSchedulerWorker:0x007fc15a307500>", "error_class"=>"NameError", "failed_at"=>1443521097.103601, "retry_count"=>0}
    2015-09-29T10:04:57.108Z 7998 TID-ow95f5gng WARN: NameError: undefined local variable or method `request' for #<InvoiceSchedulerWorker:0x007fc15a307500>
    2015-09-29T10:04:57.108Z 7998 TID-ow95f5gng WARN: /Library/WebServer/Documents/ruby/myjarvis/lib/domain_system.rb:50:in `set_db'

这是为什么?

我认为 request 变量在整个 Rails 应用程序中可用...

Sidekiq 不是您的 Rails 应用程序的一部分。它作为一个单独的进程执行,因此 Sidekiq 无法知道您的请求的详细信息。

更糟糕的是,您应该只将“simple”参数值传递给 Sidekiq worker,而这些参数在 Redis 数据库中存储为 JSON 字符串。

因此无法与 Sidekiq 共享 Rails 状态,除非手动传递所有必需的参数。

如果您有一个包含多个数据库的分片系统,并且想要 运行 跨所有数据库执行一项任务,那么在您计划的作业中,您应该为每个数据库创建一个单独的作业:

class SomeScheduledWorker
  def perform
    each_database do |dbname|
      InvoiceSchedulerWorker.perform_async(dbname)
    end
  end
end

计划的作业没有参数。如上所述,他们可以使用参数创建其他工作。现在您的 InvoiceSchedulerWorker 作业知道要使用哪个数据库。