CompletableFuture/parallelStream на сервере приложений JavaEE

Учитывая новую Java8, мы получаем действительно хорошие функции для асинхронных задач, например. CompletableFuture и .parallellStream(). Если вы запустите это в 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. Примеры выполняются в bean-компоненте @Stateful.
  2. Примеры выполняются в bean-компоненте @Stateless.
  3. Примеры выполняются в bean-компоненте CDI.

person stevietheTV    schedule 31.03.2016    source источник
comment
Последнее, что я слышал (и это было давно), находится здесь: coopsoft.com/ar/Calamity2Article. html#EE   -  person edharned    schedule 01.04.2016


Ответы (1)


Вы не должны использовать ForkJoinPool в Java EE. Только сервер приложений должен предоставлять конструкции для параллелизма (например, ManagedExecutorService в Java EE 7), поскольку контейнер должен управлять потоками.

Любопытно, что в списке рассылки, упомянутом в этом ответе, есть сообщение, в котором утверждается, что ForkJoinPool изящно деградирует до однопоточного в ЕЕ-контейнер. Я тестировал это с помощью 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

Возможно, деградация станет доступной в Java EE 8, когда в большинстве отдельных спецификаций будут использоваться функции SE 8.


Изменить

Я проверил исходный код Glassfish 4.1.1 и не нашел ни одного случая использования ForkJoinPool, ForkJoinWorkerThreadFactory или ForkJoinWorkerThread. Таким образом, ресурсы параллелизма, управляемые сервером приложений, не основаны ни на одной из этих конструкций. К сожалению, на самом деле нет доступного механизма деградации.

person andrepnh    schedule 01.04.2016
comment
Да, я тоже читал это понижение, но ему уже два года, и всякий раз, когда я запускал примеры, я, как обычно, вижу параллелизм :) Моя рабочая теория заключается в том, что он будет использовать ManagedExecutorService для получения пула потоков, управляемого сервером приложений. О каком списке рассылки вы говорите? - person stevietheTV; 01.04.2016
comment
Этот. В JCP дела идут медленно, медленнее, если это связано с Java EE. Я не удивлюсь, если он будет в том же состоянии, что и когда он вышел, особенно потому, что это произошло до SE 8, а это означает, что это, вероятно, не является частью спецификации. Я считаю, что даже если бы это работало, скажем, на стеклянной рыбе, не было бы никакой гарантии переносимости. Но я постараюсь найти что-то более определенное. - person andrepnh; 01.04.2016
comment
Ухудшение было упомянуто, когда был выпущен JDK8, однако спецификация Java EE 7 основана на JDK 7 и не рассматривает какие-либо специальные функции JDK8 каким-либо особым образом. Надеюсь, деградация будет стандартизирована в EE 8, но пока я ничего об этом не слышал. - person OndroMih; 01.04.2016
comment
Да, я проверил исходный код и действительно не использовал FJP. Я отредактировал свой ответ и также опубликую еще один в вопросе SO, в котором говорится, что есть деградация. - person andrepnh; 02.04.2016