CompleableFuture / parallelStream im JavaEE-Anwendungsserver

8

Angesichts des neuen Java8 erhalten wir wirklich nette Funktionen für asynchrone Aufgaben, z. CompleableFuture und .paralellStream (). Wenn Sie das in Java SE ausführen, wie ich es verstanden habe, werden Sie den ForkJoinPool verwenden, aber was passiert, wenn ich die folgenden Beispiele z. Wildfly oder TomcatEE?

%Vor%

Was passiert und wo werde ich meine Ressourcen ausleihen, wenn

  1. Die Beispiele werden in einer @Stateful-Bean
  2. ausgeführt
  3. Die Beispiele werden in einer @Stateless-Bean
  4. ausgeführt
  5. Die Beispiele werden in einer CDI-Bean ausgeführt
stevietheTV 31.03.2016, 16:09
quelle

1 Antwort

8

Sie sollten ForkJoinPool nicht in Java EE verwenden. Nur der App-Server sollte Konstrukte für Parallelität bereitstellen (wie der ManagedExecutorService in Java EE 7), da Threads vom Container verwaltet werden müssen .

Seltsamerweise gibt es in der Mailingliste, die in dieser Antwort erwähnt wird, eine Nachricht, in der behauptet wird, dass ein ForkJoinPool in Würde zu Single degradiert -Einschub in einem EE-Container. Ich habe dies mit Glassfish 4.1 getestet und die üblichen Threads erstellt. Ausführen dieses Codes:

%Vor%

Ich bekomme folgende Ausgabe:

%Vor%

Vielleicht wird die Verschlechterung auf Java EE 8 verfügbar sein, wenn die meisten individuellen Spezifikationen SE 8 Funktionen nutzen werden.

Bearbeiten

Ich habe den Quellcode von glassfish 4.1.1 überprüft, und es gibt keine einzige Verwendung von ForkJoinPool , ForkJoinWorkerThreadFactory oder ForkJoinWorkerThread . Daher basieren die vom App-Server verwalteten Parallelressourcen nicht auf einem dieser Konstrukte. Leider gibt es wirklich keinen Degradationsmechanismus.

    
andrepnh 01.04.2016, 02:16
quelle