2010-02-08 6 views
2

Je suis en train de passer une liste d'arguments à un backgroundrb
dans la documentation, il est dit:
MiddleMan.worker (: billing_worker) .async_charge_customer (: arg => current_customer.id)Comment passer plus d'un argument à un travailleur à backgroundrb

mais il ne fonctionne que pour un seul argument, j'ai essayé ces derniers mais pas travaillé pour moi args => [1,2,3] args => {: t => "t",: r => "r"}

des idées comment résoudre ce ??

+0

Eh bien, vous voudrez peut-être regarder le code. Dans l'exemple, "charge_customer" accepte un argument, donc envoyer: arg avec juste un argument semble correct. Je me demande pourquoi vous avez changé de: arg à: args si .. Avez-vous essayé juste: arg => [1,2,3]? – Trevoke

Répondre

1

Ce que vous essayez semble raisonnable pour moi. J'ai jeté un oeil à rails_worker_proxy.rb (à partir du code source de github). A partir d'une lecture de code, les async_ * méthodes acceptent les deux: arg et: 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) 

Pouvez-vous partager un extrait de code? Avez-vous ajouté des instructions de débogage dans votre code et/ou dans le code backgroundrb lui-même? (J'ajoute généralement quelques mises et vérifie les choses quand les choses tournent mal.)

Enfin, avez-vous envisagé d'utiliser delayed_job? Il a plus de traction de nos jours dans la communauté Rails.

0

En fait, la deuxième méthode que vous avez essayé (args => {:t=>"t", :r=> "r"}) devrait fonctionner.

Dans votre travailleur:

def charge_customer(arg) 
    customer_id = arg[:customer_id] 
    customer_name = arg[:customer_name] 

    #do whatever you need to do with these arguments... 
end 

Et puis, vous pouvez appeler le travailleur comme ceci:

MiddleMan.worker(:billing_worker).async_charge_customer(:arg => { :customer_id => current_customer.id, :customer_name => current_customer.name }) 

Fondamentalement, ce que vous faites ici est de passer un Hash comme un argument le travailleur accepte. Mais étant donné qu'un Hash peut contenir plusieurs paires clé-valeur, vous pouvez accéder à toutes ces paires individuellement dans votre worker.

+0

Merci pour la réponse Daniel, même si de nos jours j'ai presque oublié ce que j'utilisais à cette époque (j'ai demandé ça en février 2010). Je pense que je suis passé au travail retardé pour résoudre ce problème. – AndreDurao