Mono / Flux, опубликованный на ExecutorService, не завершается должным образом - PullRequest
0 голосов
/ 11 ноября 2019

Я немного поэкспериментировал с предложением в этой теме: flux внутри executorservice

, и я немного упростил пример, чтобы понять его проще. Итак, вот пример:

    ExecutorService executorService = Executors.newSingleThreadExecutor();
    Flux.just("1", "2", "3").subscribeOn(Schedulers.fromExecutorService(executorService)).doOnNext(System.out::println).subscribe();

    try {
        executorService.awaitTermination(10, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally {
        executorService.shutdownNow();
    }

Но теперь, если это выполняется, он всегда ждет 10 секунд, прежде чем основной поток завершится. Чего я ожидал? Я ожидал, что служба executor подождет максимум 10 секунд, пока не продолжит работу и не вызовет завершение работы. Обычно это должно быть сделано за несколько миллисекунд и возвращаться сразу после печати 1, 2, 3. Javadoc говорит здесь:

Блокирует, пока все задачи не завершат выполнение после запроса на выключение или не истечет время ожиданияили текущий поток прерывается, в зависимости от того, что произойдет раньше.

Я не понимаю. Что здесь не так?

Еще один пример, который запускается и заканчивается сразу (но, на мой взгляд, неправильно):

        ExecutorService executorService = Executors.newSingleThreadExecutor();
    Flux.range(1, 1_000_000).subscribeOn(Schedulers.fromExecutorService(executorService)).doOnNext(System.out::println).subscribe();
    executorService.shutdownNow();

НО, здесь я бы ожидал, что основной поток не 't дождаться завершения потока (соответственно, службы исполнителя). Но это так. В моем понимании два примера ведут себя полностью вверх ногами в соответствии с описанием Javadoc. Javadoc говорит:

Этот метод не ожидает активного завершения задач для завершения. Используйте awaitTermination, чтобы сделать это.

Есть идеи?

С уважением, Бернадо

...