Wie können Sie einen OutputStream zu einem StreamingDataHandler leiten?

8

Ich habe einen Java-Webdienst in JAX-WS, der einen OutputStream von einer anderen Methode zurückgibt. Ich kann nicht herausfinden, wie man den OutputStream in den zurückgegebenen DataHandler auf andere Weise streamen kann, als eine temporäre Datei zu erstellen, darauf zu schreiben und sie dann wieder als InputStream zu öffnen. Hier ist ein Beispiel:

%Vor%

Das Hauptproblem ist, dass die writeToOut () -Methode Daten zurückgeben kann, die viel größer sind als der Arbeitsspeicher des Computers. Aus diesem Grund verwendet die Methode MTOM in erster Linie - um die Daten zu streamen. Ich kann mich nicht darum kümmern, wie ich die Daten direkt aus dem OutputStream streamen kann, den ich dem zurückgegebenen DataHandler (und letztendlich dem Client, der den StreamingDataHandler empfängt) zur Verfügung stellen muss.

Ich habe versucht, mit PipedInputStream und PipedOutputStream herumzuspielen, aber diese scheinen nicht ganz das zu sein, was ich brauche, weil der DataHandler zurückgegeben werden müsste, nachdem der PipedOutputStream geschrieben wurde.

Irgendwelche Ideen?

    
Daniel Lew 14.05.2009, 21:53
quelle

4 Antworten

4

Ich habe die Antwort gefunden, in Anlehnung an die Zeilen, über die Christian gesprochen hat (Erstellen eines neuen Threads zum Ausführen von writeToOut ()):

%Vor%

Es ist ein bisschen komplexer wegen final Variablen, aber soweit ich das beurteilen kann, ist das korrekt. Wenn der Thread gestartet wird, blockiert er beim ersten Aufruf von out.write() ; Zur gleichen Zeit wird der Eingabestrom an den Client zurückgegeben, der das Schreiben durch Lesen der Daten freigibt. (Das Problem mit meinen früheren Implementierungen dieser Lösung war, dass ich den Stream nicht ordnungsgemäß geschlossen habe und somit Fehler auftraten.)

    
Daniel Lew 15.05.2009, 20:28
quelle
3

Entschuldigung, ich habe das nur für C # und nicht für Java gemacht, aber ich denke, Ihre Methode sollte einen Thread starten, um "writeToOut (out)" auszuführen. in paralel. Sie müssen einen speziellen Stream erstellen und an den neuen Thread übergeben, der diesen Stream an writeToOut liefert. Nach dem Start des Threads geben Sie dieses Stream-Objekt an Ihren Aufrufer zurück.

Wenn Sie nur eine Methode haben, die in einen Stream schreibt und danach zurückgibt und eine andere Methode, die einen Stream verbraucht und danach zurückgibt, gibt es keinen anderen Weg.

Der knifflige Teil ist natürlich, einen solchen "Multi-Threading-Safe-Stream" zu bekommen: Er soll jede Seite blockieren, wenn ein interner Puffer zu voll ist.

Weiß nicht, ob ein Java-Pipe-Stream dafür funktioniert.

    
Christian 14.05.2009 23:27
quelle
1

Wrappermuster? : -).

Benutzerdefinierte javax.activation.DataSource-Implementierung (nur 4 Methoden), um dies zu können?

%Vor%

Ich habe nicht die IDE, um das zu testen, also mache ich nur einen Vorschlag. Ich würde auch das writeToOut allgemeine Layout benötigen :-).

    
Mihai Toader 14.05.2009 22:38
quelle
0

In meiner Anwendung verwende ich die InputStreamDataSource-Implementierung, die InputStream als Konstruktorargument anstelle von File in FileDataSource verwendet. Es funktioniert soweit.

%Vor%

}

    
yurin 11.02.2016 17:10
quelle

Tags und Links