Как передать более одного аргумента работнику в backgroundrb - PullRequest
2 голосов
/ 08 февраля 2010

Я пытаюсь передать список аргументов в backgroundrb
в документации сказано:
MiddleMan.worker (: billing_worker) .async_charge_customer (: arg => current_customer.id)

но это работает только для одного аргумента, я пробовал это, но никто не работал для меня args => [1,2,3] args => {: t => "t",: r => "r"}

есть идеи, как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 08 февраля 2010

То, что вы пытаетесь, кажется мне разумным. Я взглянул на 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? (Я обычно добавляю несколько предложений put и проверяю, когда что-то идет не так.)

Наконец, вы рассматривали возможность использования delayed_job? В настоящее время в сообществе Rails она пользуется большей популярностью.

0 голосов
/ 02 июня 2011

На самом деле второй метод, который вы пробовали (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 может содержать несколько пар ключ-значение, вы можете получить доступ ко всем этим по отдельности внутри вашего работника.

...