我正在尝试将参数列表传递给backgroundrb
在文档中说:
MiddleMan.worker(:billing_worker).async_charge_customer(:arg => current_customer.id)
但它只适用于一个参数,我试过这些,但没有一个适合我 args => [1,2,3] args => {:t =>“t”,:r => “R”}
任何想法如何解决这个问题?
答案 0 :(得分: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)
您可以共享代码段吗?您是否在代码和/或后台代码本身中添加了任何调试语句? (我通常会添加一些put语句,并在出现问题时检查事情。)
最后,你考虑过使用delayed_job吗?如今,它在Rails社区中拥有更多的牵引力。
答案 1 :(得分: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 })
基本上,你在这里做的是传递一个Hash作为工人接受的一个参数。但由于Hash可以包含多个键值对,因此您可以在工作者中单独访问所有这些键值对。