2017-03-11 1 views
1

Ich brauche Hilfe einen Arbeiter mit sidekiq für diese Situation zu entwickeln:Wie erstelle ich einen Hintergrundjob für die Get-Anfrage mit Sidekiq und httparty?

Ich habe einen Helfer, der wie folgt aussieht:

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 

In meinem app/views/uploads/index.html.erb Ich mache das nur

<% save_image %> 

Jetzt, Wenn ein Benutzer die Uploads/Index-Seite besucht, werden die Bilder in der Datenbank gespeichert.

Das Problem ist, dass die Get-Anfrage an die API wirklich langsam ist. Ich möchte Anforderungstimeouts verhindern, indem ich dies in einen Hintergrundjob mit sidekiq verschiebe.

Das ist mein workers/api_worker.rb

class ApiWorker 
    include Sidekiq::Worker 

    def perform 

    end 

end 

Ich weiß es einfach nicht der beste Weg, um von hier aus, um fortzufahren.

Antwort

1

Das Ausführen dieser Task mit einem Sidekiq-Worker impliziert, dass die Task async ausgeführt wird und daher nicht in der Lage ist, die Antwort, die von images.select(&:persisted?) gesendet wird, sofort zurückzugeben.

Zuerst, anstatt save_image aufrufen, müssen Sie die perform_async Methode des Arbeitnehmers aufrufen.

<% ApiWorker.perform_async %> 

Dies wird einen Job in der Warteschlange Sidekiq (your_queue in diesem Beispiel) einreihen. Rufen Sie dann in der perform-Methode des Arbeiters die save_image-Methode von UploadsHelper auf.

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

    def perform 
    save_image 
    end 
end 

Möglicherweise möchten Sie die Antwort von save_image irgendwo speichern. Um Sidekiq mit der Verarbeitung der Jobs zu beginnen, können Sie bundle exec sidekiq über Ihr App-Verzeichnis ausführen.

+1

Genau, außer die Methode ist 'perform_async'. –

+1

@MikePerham Vielen Dank, dass Sie darauf hingewiesen haben. Ich habe es gerade mit einem einfachen ActiveJob Arbeiter zusammengebracht. :) – 31piy

+0

Ich habe eine Follow-up-Frage zu einem Problem porduction mit dem Arbeiter hier, falls Sie interessiert sind danke: http://stackoverflow.com/questions/42756028/sidekiq-error-could-not-connect-to-server- Datei oder Verzeichnis existiert nicht –

Verwandte Themen