2010-02-08 81 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

相关问题