Как получить журналы информации о потоках при вызове publishOn

Я работаю над планировщиками в реактивных потоках и использую Flux и Scheduler в этом потоке, используя метод publishOn следующим образом:

    System.out.println("*********Calling Concurrency************");
    List<Integer> elements = new ArrayList<>();
    Flux.range(1, 1000)
      .log()
      .map(i -> i * 2)
      .publishOn(Schedulers.parallel())
      //.subscribeOn(Schedulers.parallel())
      .subscribe(elements::add);
    System.out.println("-------------------------------------");

для которых я получил следующие информационные журналы:

*********Calling Concurrency************
[info] | onSubscribe([Synchronous Fuseable] FluxRange.RangeSubscription)
[info] | request(256)
[info] | onNext(1)
[info] | onNext(2)
[info] | onNext(3)
[info] | onNext(4)
[info] | onNext(5)
[info] | onNext(6)
[info] | onNext(7)
[info] | onNext(8)
[info] | onNext(9)
.....
.....
[info] | onNext(444)
[info] | onNext(445)
[info] | onNext(446)
[info] | onNext(447)
[info] | onNext(448)
-------------------------------------
[info] | request(192)
.....
.....
[info] | onNext(999)
[info] | onNext(1000)
[info] | onComplete()
[info] | request(192)

и нет информации о выполнении и обработке потока. Кроме того, иногда запрашиваются 192 элемента, а иногда - 256 элементов.

Вот зависимость, которую я использую:

<dependency> 
     <groupId>com.googlecode.slf4j-maven-plugin-log</groupId>
     <artifactId>slf4j-maven-plugin-log</artifactId> 

     <version>1.0.0</version> 
</dependency>

Как я могу получить информацию журнала о выполнении текущего / параллельного потока? Пожалуйста, предложите.


person KayV    schedule 03.01.2018    source источник


Ответы (2)


Это похоже на неправильную конфигурацию регистратора на вашей стороне.

Reactor поймет, что вы используете SLF4J, но вам по-прежнему нужна правильно настроенная реализация ведения журнала, такая как Logback, и связанные приложения, которые будут регистрировать имя потока.

Если вы вообще не хотите возиться с фреймворком ведения журнала, вы можете вызвать Loggers.useConsoleLoggers(), и он напечатает на консоли в упрощенном формате, который включает имя текущего потока. Я рекомендую делать это только для одного запуска (например, сеанса отладки), но не в производственном коде ...

person Simon Baslé    schedule 03.01.2018

Чтобы получить всю необходимую информацию, просто поставьте .log() после .publishOn()

    Flux.range(1, 1000)
        .map(i -> i * 2)
        .publishOn(Schedulers.parallel())
        //.subscribeOn(Schedulers.parallel())
        .log()
        .blockLast();

окончательный результат будет выглядеть следующим образом:

        12:13:21.964 [main] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging framework
        12:13:21.997 [main] INFO reactor.Flux.PublishOn.1 - | onSubscribe([Fuseable] FluxPublishOn.PublishOnSubscriber)
        12:13:21.999 [main] INFO reactor.Flux.PublishOn.1 - | request(unbounded)
        12:13:22.002 [parallel-1] INFO reactor.Flux.PublishOn.1 - | onNext(2)
        12:13:22.002 [parallel-1] INFO reactor.Flux.PublishOn.1 - | onNext(4)
        12:13:22.002 [parallel-1] INFO reactor.Flux.PublishOn.1 - | onNext(6)
        12:13:22.002 [parallel-1] INFO reactor.Flux.PublishOn.1 - | onNext(8)
        12:13:22.002 [parallel-1] INFO reactor.Flux.PublishOn.1 - | onNext(10)
        12:13:22.002 [parallel-1] INFO reactor.Flux.PublishOn.1 - | onNext(12)

так что в этом случае информация о потоке будет там

Примечание: вывод может отличаться в зависимости от используемой библиотеки Logger.

person Oleh Dokuka    schedule 03.01.2018
comment
извините, до сих пор не получил информацию - person KayV; 03.01.2018
comment
@KayV, позволь мне проверить зависимость логгера - person Oleh Dokuka; 03.01.2018
comment
вот это ‹dependency› ‹groupId› com.googlecode.slf4j-maven-plugin-log ‹/groupId› ‹artifactId› slf4j-maven-plugin-log ‹/artifactId› ‹version› 1.0.0 ‹/version› ‹/ зависимость › - person KayV; 03.01.2018
comment
Ага! Понятно, на самом деле проблема в ваших утилитах регистрации. - person Oleh Dokuka; 03.01.2018
comment
Попробуйте использовать другой регистратор или играйте без зависимости от регистратора - person Oleh Dokuka; 03.01.2018
comment
Если вы вообще не хотите возиться с фреймворком ведения журнала, вы можете вызвать Loggers.useConsoleLoggers(), и он напечатает на консоли в упрощенном формате, который включает имя текущего потока. Я рекомендую делать это только для одного запуска (например, сеанса отладки), но не в производственном коде ... - person Simon Baslé; 03.01.2018
comment
@ SimonBaslé, этот Loggers.useConsoleLoggers () мне помог. Пожалуйста, добавьте это как ответ, который я могу принять. Спасибо - person KayV; 03.01.2018