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 作业知道要使用哪个数据库。
我创建了一个模块:
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 作业知道要使用哪个数据库。