2010-02-08 60 views
2

我試圖將參數列表傳遞給backgroundrb
在文檔中它說:
MiddleMan.worker(:billing_worker).async_charge_customer(:arg => current_customer.id)如何將多個參數傳遞給工作人員在backgroundrb

,但它僅適用於只是一個說法,我嘗試了這些,但沒有工作對我來說 ARGS => [1,2,3] ARGS => {:T => 「T」: r =>「r」}

任何想法如何解決這個??

+0

那麼,你可能想看看代碼。在這個例子中,「charge_customer」接受一個參數,所以發送:arg只有一個參數似乎沒問題。我想知道爲什麼你從:arg改爲:args雖然..你試過了嗎:arg => [1,2,3]? – Trevoke 2010-02-08 16:10:28

回答

1

你對我的嘗試似乎是合理的。我看了一下rails_worker_proxy.rb(來自github源代碼)。從讀取的代碼中,async_ *方法同時接受:arg和:args:

arg,job_key,host_info,scheduled_at,priority = arguments && arguments.values_at(:arg,:job_key,:host,:scheduled_at, :priority) 

# allow both arg and args 
arg ||= arguments && arguments[:args] 

# ... 

if worker_method =~ /^async_(\w+)/ 
    method_name = $1 
    worker_options = compact(:worker => worker_name,:worker_key => worker_key, 
          :worker_method => method_name,:job_key => job_key, :arg => arg) 
    run_method(host_info,:ask_work,worker_options) 

您能分享一個代碼片段嗎?你有沒有在你的代碼和/或backgroundrb代碼中添加任何調試語句? (我通常會添加幾條語句,並在事情出錯時檢查事情。)

最後,您是否考慮過使用delayed_job?它現在在Rails社區有更多的牽引力。

0

其實,你試過的第二種方法(args => {:t=>"t", :r=> "r"})應該可以工作。

在你的工人:

def charge_customer(arg) 
    customer_id = arg[:customer_id] 
    customer_name = arg[:customer_name] 

    #do whatever you need to do with these arguments... 
end 

然後,你可以這樣調用工人:

MiddleMan.worker(:billing_worker).async_charge_customer(:arg => { :customer_id => current_customer.id, :customer_name => current_customer.name }) 

基本上,你在做什麼這裏是傳遞一個哈希作爲一個參數工人接受。但是由於哈希可以包含多個鍵值對,因此您可以在工作人員中單獨訪問所有這些。

+0

感謝Daniel的回答,現在我幾乎忘記了當時我正在使用的是什麼(我在2010年二月問過)。我想我改用了delayedjob來解決這個問題.. – AndreDurao 2011-06-02 11:43:23

相關問題