我正在处理反应流中的调度程序,并使用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>
如何获取有关当前线程/并行线程执行的日志信息? 请建议。
答案 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次运行(如调试会话)执行此操作,但不是在生产代码中...