2017-03-11 1 views
1

Je besoin d'aide pour le développement d'un travailleur sidekiq cette situation:Comment créer un job d'arrière-plan pour obtenir une requête avec Sidekiq et httparty?

J'ai une aide qui ressemble à ceci:

module UploadsHelper 

    def save_image 
     response = HTTParty.get(ENV['IMAGE_URI']) 
     image_data = JSON.parse(response.body) 
     images = image_data["rows"].map do |line| 
      u = Image.new 
      u.description = line[5] 
      u.image_url = line[6] 
      u.save 
      u 
     end 
     images.select(&:persisted?) 
    end 

end 

Dans mon app/views/uploads/index.html.erb je fais juste ce

<% save_image %> 

Maintenant, Lorsqu'un utilisateur visite la page de téléchargements/index, les images sont enregistrées dans la base de données.

Le problème est que la requête get à l'API est très lente. Je veux empêcher les délais d'expiration des demandes en déplaçant cela vers un travail en arrière-plan avec sidekiq.

Ceci est mon workers/api_worker.rb

class ApiWorker 
    include Sidekiq::Worker 

    def perform 

    end 

end 

Je ne sais pas la meilleure façon de procéder d'ici.

Répondre

1

L'exécution de cette tâche à l'aide d'un agent Sidekiq implique que la tâche s'exécutera en asynchrone et ne pourra donc pas renvoyer la réponse immédiatement, qui est envoyée par images.select(&:persisted?).

Tout d'abord, au lieu d'appeler le save_image, vous devez appeler la méthode perform_async du salarié.

<% ApiWorker.perform_async %> 

Cela enqueue un emploi dans la file d'attente Sidekiq (your_queue dans cet exemple). Ensuite, dans la méthode perform de l'agent, appelez la méthode save_image de UploadsHelper.

class ApiWorker 
    include Sidekiq::Worker 
    sidekiq_options queue: 'your_queue' 
    include UploadsHelper 

    def perform 
    save_image 
    end 
end 

Vous voudrez peut-être enregistrer la réponse de save_image quelque part. Pour que Sidekiq commence à traiter les tâches, vous pouvez exécuter bundle exec sidekiq à partir du répertoire de votre application.

+1

Exactement, sauf que la méthode est 'perform_async'. –

+1

@MikePerham Merci de l'avoir signalé. Je viens de le faire correspondre avec un simple travailleur ActiveJob. :) – 31piy

+0

J'ai une question de suivi sur un problème de porduction avec le travailleur ici au cas où vous êtes intéressé merci: http://stackoverflow.com/questions/42756028/sidekiq-error-could-not-connect-to-server- Aucun fichier ou répertoire de ce nom –