Niestety, nagroda została przyznana za odpowiedź, która nie rozwiązuje tego problemu, dla osób mających podobne problemy.Przesyłanie obrazów w tle w kolejce powodujące przekroczenie limitu czasu aplikacji
Mam formularz z przesłaniem obrazu (heroku do s3). Po przesłaniu formularza mój serwer szyn czeka na zadanie w tle, które przesyła obraz, aby zakończyć, zanim zwróci odpowiedź użytkownikowi. Powoduje to przekroczenie limitu czasu aplikacji za każdym razem, gdy przesyłany jest obraz.
Aktualna kolejność zdarzeń:
- użytkownik przesyła formularz
- Server otrzyma formularz
- Jeśli jest to obraz, serwer rozpoczyna pracę tła
- Jeśli rozpoczęto zadanie tła, serwer czeka na zakończenie (limit czasu szyn tutaj)
- Po uruchomieniu zadanie w tle kończy się
- Serwer przetwarza żądanie
- Serwer odpowiada użytkownikowi
żądanej kolejności wydarzeń:
- użytkownik przesyła formularz
- serwer otrzyma formularz
- Serwer przetwarza bez obrazu pola
- Jeśli istnieje obraz, serwer uruchamia zadanie w tle
- Serwer odpowiada użytkownikowi
- Zadanie tło uzupełnia i serwer przetwarza przesłany obraz (zapisuje URL)
kodu Uploader
class PhotoUploader < CarrierWave::Uploader::Base
include ::CarrierWave::Backgrounder::Delay
include CarrierWave::MimeTypes
process :set_content_type
storage :fog
end
Carrierwave :: Backgrounder inicjatora
CarrierWave::Backgrounder.configure do |c|
c.backend :sidekiq, queue: :carrierwave
end
modelu User
class User < ActiveRecord::Base
mount_uploader :photo, PhotoUploader, delayed: true
process_in_background :photo
end
Nie ma kod kontrolera, ponieważ forma jest obsługiwane przez ActiveAdmin. Mogę zastąpić wszędzie tam, gdzie jest to potrzebne, ale nie jestem w stanie dowiedzieć się, co należy zmienić.
Co muszę zmienić, aby uzyskać prawidłową kolejność zdarzeń?
Przebaczam, jeśli całkowicie źle zrozumiałem ten problem, ale czy przesłanie nie będzie asynchroniczne, jeśli zostanie wykonane za pomocą standardowego formularza HTML? Czy to nie wymaga JavaScript do obsługi asynchronicznego przesyłania, coś w tym stylu? https://github.com/JangoSteve/remotipart – Ben
Wszystkie samouczki i zasoby, których szukałem do przesyłania obrazów asynchronicznych, nie zmieniły wygenerowanego formularza HTML, tylko kontroler. Jak wspomniałem ** przesyłanie zdjęć działa dobrze **. Kontroler, który przetwarza formularz, nie musi czekać. – MishieMoo
Przepraszamy, potrzebuję więcej kodu, aby zrozumieć, jak próbujesz to zaimplementować. Czy pracownik sidekiq obsługuje cały załadunek do S3, czy właśnie czeka w kolejce, kiedy przesyłanie jest wykonywane, aby obsłużyć aktualizację DB? Jak wygląda twój kontroler, który reaguje na przesłanie formularza? – Ben