2

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

但它只适用于一个参数,我尝试了这些但没有一个对我有用 args => [1,2,3] args => {:t=>"t",​​ :r=> "r"}

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

4

2 回答 2

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 代码本身中添加了任何调试语句?(我通常会添加一些 puts 语句并在出现问题时进行检查。)

最后,您是否考虑过使用delayed_job?如今,它在 Rails 社区中具有更大的吸引力。

于 2010-02-08T16:55:48.627 回答
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 可以包含多个键值对,你可以在你的 worker 中单独访问所有这些。

于 2011-06-02T03:25:15.657 回答