JavaEE应用服务器中的CompletableFuture / parallelStream

鉴于新的Java8,我们为异步任务获得了非常好的function,例如CompletableFuture和.paralellStream()。 如果你在Java SE中运行它,因为我已经理解它你将使用ForkJoinPool,但是如果我在例如Wildfly或TomcatEE中运行以下示例会发生什么?

//Here I start a comp.Future without giving an Executor test = CompletableFuture.supplyAsync(() -> timeConsumingMethod()); //Here I start a parallel stream mList.paralell().filter(...).collect(Collectors.toList()) 

会发生什么,我将从哪里借用我的资源

  1. 这些示例在@Stateful bean中运行
  2. 这些示例在@Stateless bean中运行
  3. 这些示例在CDI bean中运行

您不应该在Java EE中使用ForkJoinPool。 只有app服务器应该提供并行性的构造(如Java EE 7中的ManagedExecutorService ),因为线程必须由容器管理 。

奇怪的是,在这个答案中提到的邮件列表中有一条消息声称ForkJoinPool会优雅地降级为EE容器中的单线程。 我用glassfish 4.1对它进行了测试,并创建了常用的线程。 运行此代码:

 @Singleton public class SomeSingleton { public void fireStream() { IntStream.range(0, 32) .parallel() .mapToObj(i -> String.format("Task %d on thread %s", i, Thread.currentThread().getName())) .forEach(System.out::println); } } 

我得到以下输出:

 Info: Task 20 on thread http-listener-1(4) Info: Task 10 on thread ForkJoinPool.commonPool-worker-3 Info: Task 21 on thread http-listener-1(4) Info: Task 11 on thread ForkJoinPool.commonPool-worker-3 Info: Task 22 on thread http-listener-1(4) Info: Task 8 on thread ForkJoinPool.commonPool-worker-3 Info: Task 23 on thread http-listener-1(4) Info: Task 9 on thread ForkJoinPool.commonPool-worker-3 Info: Task 18 on thread http-listener-1(4) Info: Task 14 on thread ForkJoinPool.commonPool-worker-3 Info: Task 19 on thread http-listener-1(4) Info: Task 15 on thread ForkJoinPool.commonPool-worker-3 Info: Task 16 on thread http-listener-1(4) Info: Task 17 on thread http-listener-1(4) Info: Task 4 on thread http-listener-1(4) Info: Task 5 on thread http-listener-1(4) Info: Task 6 on thread http-listener-1(4) Info: Task 7 on thread http-listener-1(4) Info: Task 2 on thread http-listener-1(4) Info: Task 3 on thread http-listener-1(4) Info: Task 0 on thread http-listener-1(4) Info: Task 1 on thread http-listener-1(4) Info: Task 26 on thread http-listener-1(4) Info: Task 27 on thread http-listener-1(4) Info: Task 24 on thread http-listener-1(4) Info: Task 25 on thread http-listener-1(4) Info: Task 12 on thread http-listener-1(4) Info: Task 13 on thread http-listener-1(4) Info: Task 30 on thread http-listener-1(4) Info: Task 31 on thread http-listener-1(4) Info: Task 28 on thread ForkJoinPool.commonPool-worker-0 Info: Task 29 on thread ForkJoinPool.commonPool-worker-0 

当大多数单独的规范将利用SE 8function时,Java EE 8可能会出现降级。


编辑

我检查了glassfish 4.1.1源代码,并没有使用ForkJoinPoolForkJoinWorkerThreadFactoryForkJoinWorkerThread 。 因此,应用服务器管理的并行性资源不是基于任何这些结构。 不幸的是,确实没有可用的降级机制。