InputStream / OutputStream / PipedOutputStream und managedExecutorService

beta20

Top Contributor
Hallo,

ich möchte gerne folgendes realisieren:
1) Email aus GUI senden
+ Dokument generieren (als Anhang)

Es geht mir hier nicht wie ich die Email versende, sondern ich habe ein Verständnisproblem mit
  • InputStream
  • Outputstream
  • PipedOutputstream
  • ManagedExecutorService managedExecutorService

a) Wann muss eine Methode / Aktion innerhalb laufen?

Java:
 managedExecutorService.submit(() -> {
            try {
                doSomething();
            }
        catch (Exception e) {}
            return null;
        });

b) Wann verwende ich einen PipedOutputStream und was bringt mir dieser gegenüber einem OutputStream?

Mein Ablauf sieht wie folgt aus:

JSF - Controller Bean:
// Es wird ein Objekt "Offer" übergeben und daraus wird dann eine PDF erstellt
Code:
public void doSendEmail() {
    myEjbean.sendOffer(offer);
}

EJB - Bean:
- In der EJB Bean habe ich dann folgende Dinge zu tun:

1) Erstellung der PDF
Code:
PipedOutputStream createPdfWithAttachments(DocumentDesigner documentDesigner, String fileName,
            boolean preview) {

 List<InputStream> inputStreamList = new ArrayList<InputStream>();

// 1) Alle vor der PDF Dateien laden (Es werden PDF Dateien geladen, die vor dem eigentlichen Angebot sein sollen in der PDF)
// // Diese hinzufügen bei: inputStreamList.add(inputStream);

// 2) Dokument erstellen (Angebot erstellen)
PipedOutputStream createPdf(PipedOutputStream os, DocumentDesigner documentDesigner, boolean preview)
inputStreamList.add(isDocument);

// 3) Alle nach der PDF Dateien laden  (Es werden PDF Dateien geladen, die nach dem eigentlichen Angebot sein sollen in der PDF)
// Diese hinzufügen bei: inputStreamList.add(inputStream);


// 4) Merge PDF 
PipedOutputStream is = pdfGenerationHelperService.mergePdf(inputStreamList, fileName);
return is;

}


Anschließend übergebe ich den Stream (die PDF) meinem Objekt "EmailAttachment":
Java:
                 PipedOutputStream os = new PipedOutputStream();
                 PipedInputStream is = new PipedInputStream(os);
                 os = pdfDocumentGenerationService.createPdfWithAttachments(offer.getDocumentDesigner(),
                        fileName, false);

                EmailAttachment emailAttachment = new EmailAttachment();
                emailAttachment.setInputStream(is);
                emailAttachment.setFilename(fileName);
                emailAttachment.setMimeType("application/pdf");

Was ich nun nicht verstehe, wann:
a) Welche der Methoden 1-4 muss innerhalb 1) Erstellung der PDF in einem managedExecutorService.submit(() laufen? Wenn ich es richtig sehe und PipedOutputStream createPdf NICHT innerhalb managedExecutorService.submit(() laufen würde, wird diese Methode gar nicht ausgeführt?

b) Können diese managedExecutorService.submit(() auch verschachtelt sein (nested) ?

c) Macht es Sinn die EJB - Methode bereits in einem managedExecutorService.submit(() innerhalb der JSF Bean aufzurufen?
Also sowas wie:

Java:
            managedExecutorService.submit(() -> {

                try {
                    // Versenden
                    offerProcessService.sendOffer(offer)
                }

                catch (Exception e) {
                    LOGGER.error(ExceptionUtils.getFullStackTrace(e));
                }

                return;
            });

Danke für die Hilfe
 

mihe7

Top Contributor
Ein ExecutorService dient einfach dazu, Dinge im Hintergrund zu erledigen. Der ManagedExecutorService ist ein ExecutorService, der vom Application-Server zur Verfügung gestellt wird.

InputStream und OutputStream sind einfach zwei Interfaces, die das Lesen und Schreiben von bzw. in "Datenströme" regeln.

PipedInputStream und PipedOutputStream sind Implementierungen dieser Interfaces und machen nur in Kombination Sinn: was in einen PipedOutputStream geschrieben wird, kann von einem PipedInputStream gelesen werden. Das muss allerdings parallel ablaufen, weswegen Du z. B. das Schreiben in einen separaten Thread auslagerst (managedExecutorService.submit()) und im aktuellen Thread liest.
 

beta20

Top Contributor
Danke für die Antwort.
D.h. der ManagedExecutorService gibt es nur 1x, also eine Instanz?

Mir ist nicht ganz klar, wann ich im oben genannten Beispiel managedExecutorService.submit(() -> { .... } verwenden soll.
Macht das schon Sinn beim Aufruf vom WebController, also JSF Bean?
-> Wenn ich das richtig verstehe, dann wird der Thread einfach in eine Queue gespeichert?

Würde ich den Prozess nicht in die Queue speichern, dann würde der User in der Web - GUI solange warten müssen (Sand - Uhr), bis die Aktion durchgeführt wurde? Der Emailversand / Angebotsgenerierung kann ja schon ein paar Sekunden dauern? Die Frage ist dann nur, wie bekommt der User bei dieser Anfrage mit, wenn ein Fehler aufgetreten ist? Alternativ kann man dann eben eine Notification senden.

Können die managedExecutorService.submit(() - Aufrufe auch verschachtelt sein?

Also:
Java:
managedExecutorService.submit(()  {
    ....
    managedExecutorService.submit(() {....}
}

Generell auch die Frage, wie erfolgt die Abarbeitung...
Passiert das von oben nach unten?

Wird die rote Methode schon ausgeführt, wenn der die grüne Methode in einem Thread läuft, aber noch nicht fertig ist?
1598300887915.png

Hier der Methodenkopf und der Aufruf im Thread:
1598300932052.png
 

mihe7

Top Contributor
D.h. der ManagedExecutorService gibt es nur 1x, also eine Instanz?
Das ist nicht gesagt. Es geht einfach darum, dass dieser vom Application Server bereitgestellt (und dort konfiguriert) wird.

Mir ist nicht ganz klar, wann ich im oben genannten Beispiel managedExecutorService.submit(() -> { .... } verwenden soll.
Immer, wenn Du etwas ausführen willst, das den aktuellen Thread nicht blockieren soll.

Macht das schon Sinn beim Aufruf vom WebController, also JSF Bean?
Wenn Du an der Stelle etwas im Hintergrund ausführen willst, macht es Sinn.

Können die managedExecutorService.submit(() - Aufrufe auch verschachtelt sein?
Klar.

Würde ich den Prozess nicht in die Queue speichern, dann würde der User in der Web - GUI solange warten müssen (Sand - Uhr), bis die Aktion durchgeführt wurde? Der Emailversand / Angebotsgenerierung kann ja schon ein paar Sekunden dauern? Die Frage ist dann nur, wie bekommt der User bei dieser Anfrage mit, wenn ein Fehler aufgetreten ist? Alternativ kann man dann eben eine Notification senden.
1. Frage: klar. Du hast einen Request, der wird verarbeitet, was dann zu einer entsprechenden Antwort führt. So lange die Verarbeitung läuft, kann es keine Antwort geben. Mittels asynchroner Verarbeitung kannst Du also die Reaktionszeit der Anwendung senken.
2. Frage: das ist ein Grundsatzproblem asynchroner Verarbeitung, worauf es keine pauschale Antwort gibt. Oft muss fachlich eine passende Strategie gefunden werden. Wenn die Verarbeitung nur Sekunden dauern soll, kannst Du z. B. eine Push Notification senden. Oder Du speicherst "Jobs" und der Benutzer kann nachschauen, ob der Job erledigt wurde oder ...

Wird die rote Methode schon ausgeführt, wenn der die grüne Methode in einem Thread läuft, aber noch nicht fertig ist?
Du meinst wahrscheinlich das richtige. Die grüne Zeile wird vor der roten Zeile ausgeführt. Die Methode stellt aber per submit() Code zur Ausführung im Hintergrund in die Queue des Executor Services und kehrt sofort zurück. Es ist daher auch nicht gesagt, dass dieser Code bereits läuft, wenn die rote Zeile erreicht wird, z. B. könnten alle Threads des ExecutorServices gerade belegt sein. Sollte hier aber kein Problem darstellen, weil das Lesen aus dem InputStream ein blockierender Aufruf ist.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
berserkerdq2 inputstream und bufferedwirter /outputstream und bufferedwriter Java Basics - Anfänger-Themen 9
B java.io.OutputStream zu java.io.InputStream konvertieren Java Basics - Anfänger-Themen 18
B Konvertieren: Outputstream zu Inputstream Java Basics - Anfänger-Themen 13
B Input/Output InputStream (JSch) in OutputStream (Blob) überführen Java Basics - Anfänger-Themen 8
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
T Bluetooth, Inputstream Java Basics - Anfänger-Themen 0
I InputStream beim zweiten Mal fehlerhaft Java Basics - Anfänger-Themen 10
B Inputstream in file schreiben? Java Basics - Anfänger-Themen 23
B Hilfe bei InputStream To File Java Basics - Anfänger-Themen 22
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
J Was genau macht die Methode close() im InputStream? Java Basics - Anfänger-Themen 5
E InputStream im Servlet wirft Exception Java Basics - Anfänger-Themen 5
D InputStream parsen und als Bilddatei abspeichern Java Basics - Anfänger-Themen 1
G Input/Output InputStream gibt nicht die Korrekten Werte aus Java Basics - Anfänger-Themen 10
T Datentypen InputStream to list of Int (or similar) Java Basics - Anfänger-Themen 4
P bytes aus einem InputStream zählen Java Basics - Anfänger-Themen 2
P InputStream eines Musik-Streams abspielen Java Basics - Anfänger-Themen 2
I Resize Image - Einlesen von InputStream Java Basics - Anfänger-Themen 3
T Input/Output Exception bei einem InputStream Java Basics - Anfänger-Themen 2
W ProcessBuilder InputStream in Array speichern Java Basics - Anfänger-Themen 3
K InputStream erstellen Java Basics - Anfänger-Themen 4
B Input/Output Data / Buffer / File Outstream Inputstream Java Basics - Anfänger-Themen 2
L Webservice soll InputStream übergeben bekommen Java Basics - Anfänger-Themen 7
S Eigener InputStream, Hilfe bei read-Methode Java Basics - Anfänger-Themen 6
C InputStream Java Basics - Anfänger-Themen 2
O Input/Output Fragen zum InputStream Java Basics - Anfänger-Themen 7
E Input/Output Relativer Bild-Pfad für InputStream Java Basics - Anfänger-Themen 5
G Frage zu InputStream? Java Basics - Anfänger-Themen 11
E Socket InputStream "terminiert" nicht Java Basics - Anfänger-Themen 4
E Input/Output Inputstream während der Laufzeit füllen Java Basics - Anfänger-Themen 2
A Frage zu Beispiel eines Dekorierers von InputStream Java Basics - Anfänger-Themen 4
P Input/Output InputStream Listener? Java Basics - Anfänger-Themen 7
M Eigener InputStream will nicht mit BufferedReader Java Basics - Anfänger-Themen 3
S Input/Output Neuen InputStream System.in setzen Java Basics - Anfänger-Themen 11
A InputStream gibt nur jede 2te Zeile aus Java Basics - Anfänger-Themen 7
J InputStream FTP Java Basics - Anfänger-Themen 8
brunothg Inputstream zu Filechannel Java Basics - Anfänger-Themen 6
K StringWriter/String nach InputStream konvertieren Java Basics - Anfänger-Themen 3
Benji0815 Inputstream aus Konsole in JTextArea Java Basics - Anfänger-Themen 14
A Problem mit InputStream Java Basics - Anfänger-Themen 4
bastiann Kann man Inputstream nur auf ein Zeichen anwenden? Java Basics - Anfänger-Themen 5
U Inputstream.read()/readLine() blockiert immer Java Basics - Anfänger-Themen 18
S Problem mit url, inputStream und bytes beim Quellcode laden. Java Basics - Anfänger-Themen 6
G Kompletten InputStream der Kommandokonsole ausgeben Java Basics - Anfänger-Themen 8
G InputStream aufrufen, ändern und zurück geben Java Basics - Anfänger-Themen 2
W Zeichen ersetzen im InputStream Java Basics - Anfänger-Themen 3
N String vom InputStream in TextArea übertragen Java Basics - Anfänger-Themen 6
A Frage zu Puffergröße bei InputStream Java Basics - Anfänger-Themen 9
G in einem inputstream auf " " abfragen? Java Basics - Anfänger-Themen 3
M Datei speichern mittels InputStream Java Basics - Anfänger-Themen 13
P InputStream in Byte-Array speichern Java Basics - Anfänger-Themen 2
G String in InputStream umwandeln? Java Basics - Anfänger-Themen 8
M Auslesen eines InputStream Java Basics - Anfänger-Themen 4
M Problem mit InputStream Java Basics - Anfänger-Themen 7
S Probleme mit InputStream- Rückgabe Java Basics - Anfänger-Themen 4
I InputStream von Konsole abfangen Java Basics - Anfänger-Themen 6
G InputStream im finally-Block schließen Java Basics - Anfänger-Themen 7
K InputStream? Java Basics - Anfänger-Themen 3
S Sockets and InputStream Java Basics - Anfänger-Themen 2
M InputStream einer Socketverbindung funktioniert nicht Java Basics - Anfänger-Themen 19
M Byte InputStream zu Zeichenformat Unicode bzw String konvert Java Basics - Anfänger-Themen 5
R InputStream erstellen, der aus String liest Java Basics - Anfänger-Themen 8
R ENTER in InputStream nicht lesen Java Basics - Anfänger-Themen 4
G InputStream auslesen und zurückschreiben Java Basics - Anfänger-Themen 9
R BufferedReader <-> InputStream Java Basics - Anfänger-Themen 3
R Suche geeignetes InputStream Java Basics - Anfänger-Themen 2
D InputStream -> Image Java Basics - Anfänger-Themen 6
M String zu InputStream/InputSource Java Basics - Anfänger-Themen 2
S Problem mit InputStream / flush() / BufferedReader Java Basics - Anfänger-Themen 19
C Aus ein Image-Objekt einen InputStream generieren? Java Basics - Anfänger-Themen 6
J InputStream in String umwandeln Java Basics - Anfänger-Themen 5
J InputStream ist null Java Basics - Anfänger-Themen 7
P InputStream, BufferedString Java Basics - Anfänger-Themen 3
berserkerdq2 Wo ist der SInn, dass man den Stream, den ich zum Schreiben nutze, outputstream nenne? Java Basics - Anfänger-Themen 5
J Nachricht an OutputStream Java Basics - Anfänger-Themen 2
I Probleme mit OutputStream - Datei lässt sich nicht öffnen Java Basics - Anfänger-Themen 4
B Input/Output OutputStream im Paramaeter Java Basics - Anfänger-Themen 2
B OutputStream in FileInputStream? Java Basics - Anfänger-Themen 9
T ObjectInput/OutputStream Fragen zur Funktionsweise Java Basics - Anfänger-Themen 3
M ArrayList durch OutputStream in Datei Java Basics - Anfänger-Themen 9
S Objekte mit Outputstream in Safefile Java Basics - Anfänger-Themen 4
B Input/Output Socket I/O - outputStream.write(-1) Java Basics - Anfänger-Themen 2
B Socket OutputStream Java Basics - Anfänger-Themen 17
B [Erledigt] Fehlverhalten mit File, FileInput/OutputStream und FileChannel Java Basics - Anfänger-Themen 4
Forlan OutputStream Initialisieren Java Basics - Anfänger-Themen 4
F DataIn/Outputstream Java Basics - Anfänger-Themen 4
lars-sh HttpURLConnection und OutputStream Java Basics - Anfänger-Themen 4
A String in OutputStream schreiben Java Basics - Anfänger-Themen 5
D An Datei "anhängen" mit OutputStream Java Basics - Anfänger-Themen 9
S Outputstream & String? Java Basics - Anfänger-Themen 4
reibi OutputStream nach ByteOutputStream konvertieren Java Basics - Anfänger-Themen 21
P OutputStream Java Basics - Anfänger-Themen 7
H OutputStream Java Basics - Anfänger-Themen 8
M ProcessBuilder und OutputStream Java Basics - Anfänger-Themen 2
M OutputStream funktioniert nur in Endlosschleife ? Java Basics - Anfänger-Themen 4
R OutputStream direkt in StringBuffer schreiben lassen Java Basics - Anfänger-Themen 2
G ClassLoader und OutPutStream Java Basics - Anfänger-Themen 3
G Standard OutputStream out wiederherstellen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben