2012-06-19 8 views
5

Jaki jest najlepszy sposób na wprowadzenie pewnego rodzaju wskaźnika postępu w Play?Wskaźnik postępu w strukturze gry

Mam prostą stronę importu, gdzie użytkownik może przesłać plik csv. Serwer wykonuje dłuższe przetwarzanie do czasu zakończenia importowania. Chciałbym przekierować użytkownika na osobną stronę po przesłaniu i dać mu dalsze informacje zwrotne na tej stronie á la "150 z 856 importowanych zbiorów danych".

Czynność przesyłania uruchamia metodę kontrolera, która może uruchomić czasochłonne zadanie we własnym wątku, ale jak uzyskać status zadania z wywołaniem ajax z innej strony (ponieważ gra nie ma żadnego rodzaju stan między żądaniami)?

Odpowiedz

3

To, co możesz zrobić, to stworzyć zadanie ze swojego kontrolera. W rzeczywistości, jeśli czytasz dokumentację Play, jesteś wyraźnie zachęcany do wykonywania długotrwałego przetwarzania w zadaniach, aby nie hogować wątków żądań HTTP.

Twoja praca jest wykonywana, przetwarzając Twój plik CSV. Następnym krokiem jest zapisanie, kiedy każdy zestaw danych został przetworzony. Załóżmy, że przekazujesz Jobowi referencję, taką jak numer identyfikacyjny lub unikatowy numer, który przekazujesz swojemu klientowi. Następnie wystarczy zarejestrować (prawdopodobnie w bazie danych, jeśli chcesz dostosować się do bezpaństwowości i skalować w łatwy sposób) każdy przyrost liczby zestawów danych przetworzonych na podstawie unikalnego identyfikatora.

np

@Entity 
public class DatasetProgress extends Model { 

    public Long uid; 
    public Long datasetsDone; 
    public Long datasetsTotal; 

} 

Następnie można utworzyć działania kontrolera, która zwraca obiekt DatasetProgress oparciu o UID, które można wykorzystać, aby pokazać pasek postępu.

1

Jedną z rzeczy, które możesz zrobić, to mieć scentralizowane powiadomienie. Możesz zaimportować unikalny identyfikator i napisać komunikaty aktualizacji z tym identyfikatorem. Następnie, aby odzyskać status, wystarczy użyć tego klucza.

Inną opcją jest korzystanie z gniazd internetowych i zasadniczo przekazywanie powiadomień z powrotem do klienta (choć nie są jeszcze szeroko obsługiwane).

+1

Użyłbym obu odpowiedzi: John's i @Codemwnci, ​​aby wykonać to zadanie, zwłaszcza jeśli masz pewność, że będziesz używał przeglądarek obsługujących WebSockets lub przynajmniej Comet. W takim przypadku możesz stworzyć naprawdę żywy pasek postępu. – biesior

Powiązane problemy