Wie gehen große response-Daten aus Java rest web service an den client?

Ich bin auf die Schaffung eines Java Rest web service, der einen großen Bericht im JSON-format. Diese können so groß wie einige Millionen Zeilen. Was ist der beste Weg für die Implementierung von web-Dienstleistung, die effizient senden Sie diese großen Daten als Antwort auf eine vom client. Ich kann nicht konvertieren, Datensatz in JSON im Speicher erstellt wird, die Last auf GC.



2 Replies
  1. 1

    Es hängt alles vom Kontext ab 🙂

    Wenn Sie dienen die Daten als JSON (und nehme an, Sie sind von „Trikot-tag“), schlage ich vor, senden Sie Ihr Objekt (Reihen-Bericht) eingewickelt in die Struktur für die Implementierung von paging-Funktionalität.

    {
        "current-page" : (num),
        "max-pages" : (numOfAllPages),
        "rows" : [{
           {(row1)},    {(row2)},   {(row...n)},
       }]
    }

    und Ihre REST-handler akzeptiert QueryString-parameter wie: ?Seite=(num)

    Es sei denn, Sie senden müssen alle Zeilen auf einmal.. Wenn Sie das tun-ich würde vorschlagen, das schreiben direkt an den response-stream, einstellen der richtigen Antwort Header für den Benutzer auslösen „download“ – Funktion.

    • Auch stellen Sie sicher, dass gzip auf dem server aktiviert ist
    • es gibt eine Handvoll von Kopf-wir können-noch einmal, hängt davon ab, wie man vorgeht, um das problem anzugehen. in Szenario downloaden, die großen Pakete sind, ist es nützlich zu verwenden: – “ content-transfer : gzip,deflate (Lesen Sie vor-und Nachteile, die Lösung!!!!) – content-transfer : chunked – accept-ranges : bytes
  2. 1

    Gibt es einige Lösungen
    Zunächst ist Paginiert als Miron hingewiesen.

    Zweiten Klobige Ausgabe
    Sie senden es mit der ChunkyOutput Klasse. In diesem client auch die Notwendigkeit zu konsumieren, als ChunkyInput

    @Path("/chunkyresource")
    public class ResourceSentAsChunks {
        @GET
        public ChunkedOutput<String> chunkedGet() {
            System.out.println("ResourceSentAsChunks.chunkedGet()");
            final ChunkedOutput<String> output = new ChunkedOutput<String>(String.class);
    
            new Thread() {
                @Override
                public void run() {
                    try {
                        for (int i = 0; i < 100000; i++) {
                            output.write(i + " ");
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                        try {
                            output.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }.start();
            return output;
        }

    Dritten Komprimierung zu verwenden, wenn Sie können senden Sie Ihre Antwort als Anhang oder wenn Sie eine eigene client-Anwendung . Diese Technik weit verbreitet ist im Falle von Bildern.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.