Nor*_*csi 5 java spring reactor spring-webflux
我做了一个简单的 Spring Boot 应用程序。我有一个 REST 端点,它返回当前时间的热流。
@RestController
public class NowResource {
@GetMapping(value = "/now", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> now() {
return Flux.interval(Duration.ofSeconds(1))
.flatMap(t -> Flux.just(Instant.now().toString()));
}
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时,http://localhost:8080/now我得到一个数据流,如下所示:
数据:2018-04-03T13:20:38.313222100Z
数据:2018-04-03T13:20:39.311493500Z
数据:2018-04-03T13:20:40.310878800Z
...
当我与流断开连接(关闭浏览器选项卡)时,IOException会抛出、捕获并打印堆栈跟踪。
java.io.IOException:已建立的连接被主机中的软件中止
...
我尝试过捕获它,但它已经被捕获并且没有返回到我的方法。
我尝试在 Flux 中添加等doOnTerminate(),doOnError()但似乎没有任何效果,我猜测实际事件是不同类型的。
我可以以某种方式访问此异常,以不同于仅打印它的方式处理它吗?(我想避免在日志中输出 200 多行,而只打印“DONE”。)
编辑:我的解决方案基于托马斯·皮诺斯的答案
我最终采用了这种方法,不同之处在于我将其移至一个新类,这样它就可以处理来自所有控制器的所有此类异常。
@Slf4j
@ControllerAdvice
class IOExceptionHandler implements WebExceptionHandler {
@ExceptionHandler(IOException.class)
public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
return Mono.just(ex.getMessage())
.doOnNext(
msg -> log.warn("IOException occurred: {}.", msg)
)
.then();
}
}
Run Code Online (Sandbox Code Playgroud)
该异常与浏览器和控制器之间的 HTTP 连接处理(简单地说)有关。
它可以在控制器的方法中处理@ExceptionHandler(或者在@ControllerAdvice类中,如果您想在更多控制器上应用相同的异常处理)。
例如:
@RestController
public class NowResource {
...
@ExceptionHandler(IOException.class)
public void handleException(IOException e) {
log.warn("IOException occurred: {}", e.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1037 次 |
| 最近记录: |