调用publishOn时如何获取线程信息日志

时间:2018-01-03 08:05:53

标签: project-reactor publisher reactive-streams

我正在处理反应流中的调度程序,并使用publishOn方法在此Flux上使用Flux和Scheduler,如下所示:

    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>

如何获取有关当前线程/并行线程执行的日志信息? 请建议。

2 个答案:

答案 0 :(得分:2)

要获取所有必填信息,请在.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)

所以在这种情况下,有关Thread的信息将在那里

  

注意 :输出可能会有所不同,具体取决于使用的Logger库

答案 1 :(得分:2)

这看起来像是你身边的记录器配置错误。

Reactor会选择你使用SLF4J,但你仍然需要一个正确配置的日志记录实现,比如Logback,以及将记录线程名称的相关appender。

如果您不想使用日志记录框架,您可以调用Loggers.useConsoleLoggers(),它将以包含当前线程名称的简化格式在控制台上打印。我建议只对1次运行(如调试会话)执行此操作,但不是在生产代码中...