2017-09-08 1 views
1

Auf Knopfdruck möchte ich meinen Dienst aufrufen, Datenbank abzufragen und csv-Datei zu generieren und zurück zu Benutzer zurückzukehren. Dieser Prozess läuft lange (kann bis zu 40 Sekunden dauern) Ich möchte den Benutzer nicht blockieren. Ich würde lik Fortschritt-Seite zu erstellen, in dem Benutzer einen Fortschritt der Erstellung von Berichten heften können:Generieren von Dateiprozessaktualisierungen im Frühjahr mvc

Meine Idee ist:

Nehmen Sie eine Eingabe von Benutzern und Create Anfrage an den Service stellen. Warten Sie nicht auf die Antwort, senden Sie die Berichts-ID an den Benutzer zurück. Die neue Registerkarte wird geöffnet, wo der Benutzer den Status der Berichterstellung überwachen kann. Benutzer kann die Berichtsseite überprüfen, um den Status seiner Anfrage zu sehen Wenn die Anfrage fertig ist - wird der Download des Berichts im Browser gestartet.

würde Ich mag smth wie diese haben:

ein. Controller-Methode, die die Datei speichert und die Datei-ID zurückgibt. Danach wird der neue Thread in diesem Contorller den Dienst aufrufen und Daten in die angegebene Datei schreiben b. Controller-Methode, die mit Anforderung params Bericht des Status zeigen - fileid Überprüfen Sie, ob Datei generiert oder nicht Wenn Datei generiert wird - schreiben Datei auf den HttpServletResponse Antwort

Frage ist: Wo sollte ich Datei-ID speichern und wie Datei-ID verbinden und Datei selbst? (Cache? Datenbank?)

Wie kann ich den Berichtstatus prüfen? Ich denke daran, alle 1-2 Sek. Eine AJAX-Anfrage zu senden.

Irgendwelche Ideen und Empfehlungen?

Antwort

1

Laut mir können Sie ein Servlet erstellen, um mit CSV-Datei-Download zu reagieren. Betrachten Sie das folgende Verfahren:

Taste Ein Klick öffnen neue Registerkarte mit url (anhängen url mit ReportID oder so)

window.open('/downloadCSV/15646', '_blank'); 

Und dann ein Servlet für diesen Download-Vorgang schreiben

@RequestMapping(path = "/downloadCSV/{reportId}", method = 
    RequestMethod.GET) 
     public void getCSV(@PathVariable String reportId, HttpServletRequest 
     request, HttpServletResponse response) throws Exception { 

      byte[] fileContent; 

      //write your logic or call service to generate csv report and get 
      bytes of file 

       response.setContentType("provide content type"); 
       ServletOutputStream out = response.getOutputStream(); 
       out.write(fileContent); 
       out.flush(); 
      return; 
     } 

dieser Wille Laden Sie die Datei im geöffneten Register

herunter