2015-09-29 35 views
0

我已經創建了一個模塊:導軌 - 爲什麼我得到一個未定義的方法`request`方法的工作中 - Sidekiq

module DomainSystem 

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

end 

我已經包含在工人:

class InvoiceSchedulerWorker 

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

    recurrence { daily } 

    def perform 
     @var = set_db 
     ... 
    end 

現在每當我打電話給這個日程安排工時,我會收到一個錯誤:

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應用程序可用...

+2

只有控制器和視圖我認爲,在任何情況下,沒有請求被預定作業做呢? –

回答

2

Sidekiq是不是你的Rails應用程序的一部分。它作爲一個單獨的流程執行,因此Sidekiq無法知道您的請求的詳細信息。

更糟的是,你應該通過唯一的「simple」參數值Sidekiq工人,而這些參數都存儲在數據庫Redis的JSON字符串。

所以沒有辦法與Sidekiq,分享Rails的狀態,除了手動傳遞所有必需的參數。

+0

現在我明白了。我如何將一個參數傳遞給一個預定的工作(比如我的例子)?這種特殊的工作不會被調用通過調度... – WagnerMatosUK

+1

其他地方,但只有@WagnerMatosUK你應該把它們配置則 – dimakura

+0

但是,這是最棘手的部分,雖然,這是一個多領域的應用程序,所以我不能擁有它硬編碼在配置文件中。 – WagnerMatosUK

0

如果你有多個數據庫分片系統,並希望運行的所有數據庫中一個任務,然後在你的計劃的作業,你應該爲每個數據庫創建一個單獨的作業:

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

計劃的作業沒有參數。如上所述,他們可以用參數創建其他工作。現在您的InvoiceSchedulerWorker作業知道使用哪個數據庫。

相關問題