如何在backgroundrb向工作者传递多个参数

时间:2010-02-08 13:48:06

标签: ruby-on-rails ruby backgroundrb

我正在尝试将参数列表传递给backgroundrb
在文档中说:
MiddleMan.worker(:billing_worker).async_charge_customer(:arg => current_customer.id)

但它只适用于一个参数,我试过这些,但没有一个适合我 args => [1,2,3] args => {:t =>“t”,:r => “R”}

任何想法如何解决这个问题?

2 个答案:

答案 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可以包含多个键值对,因此您可以在工作者中单独访问所有这些键值对。