作者热门文章
- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
在Publisher使用subscribe()方法的时候,Subscriber触发回触发一系列的on方法,如onSubscribe();为了更好的监控以及观测异步序列的传递情况,设置了一系列的doOn方法,在触发on方法的时候作behavior的副作用发生用于监控行为的运行情况
一下为部分代码实现:
@Test
public void doOnWithMono () {
Mono.just("ffzs")
.map(String::toUpperCase)
.doOnSubscribe(subscription -> log.info("test do on subscribe"))
.doOnRequest(longNumber -> log.info("test do on request"))
.doOnNext(next -> log.info("test do on next1, value is {}", next))
.map(String::toLowerCase)
.doOnNext(next -> log.info("test do on next2, value is {}", next))
.doOnSuccess(success -> log.info("test do on success: {}", success))
.subscribe();
}
@Test
public void doOnWithFlux () {
Flux.range(1,10)
.map(i -> {
if (i == 3) throw new RuntimeException("fake a mistake");
else return String.valueOf(i);
})
.doOnError(error -> log.error("test do on error, error msg is: {}", error.getMessage()))
.doOnEach(info -> log.info("do on Each: {}", info.get()))
.doOnComplete(() -> log.info("test do on complete")) // 因为error没有完成不触发
.doOnTerminate(() -> log.info("test do on terminate")) // 无论完成与否,只要终止就触发
.subscribe();
}
reactor提供了一个很便利的监控方法:log()
在编写publisher的时候加上log,在subscriber调用的时候会将触发的每一个behavior以日志的形式打印出来:
看个小栗子:
@Test
public void logTest () {
Flux.range(1,5)
.map(i -> {
if (i == 3) throw new RuntimeException("fake a mistake");
else return String.valueOf(i);
})
.onErrorContinue((e, val) -> log.error("error type is: {}, msg is : {}", e.getClass(), e.getMessage()))
.log()
.subscribe();
}
效果如下,日志内容很详细,线程使用,onNext,request这些都会标明
在Publisher使用subscribe()方法的时候,Subscriber触发回触发一系列的on方法,如onSubscribe();为了更好的监控以及观测异步序列的传递情况,设置了一系列的doOn
我是一名优秀的程序员,十分优秀!