标签: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()));
}
}
当我调用http:// localhost:8080 /现在我得到的数据流如下所示:
data:2018-04-03T13:20:38.313222100Z
data:2018-04-03T13:20:39.311493500Z
data:2018-04-03T13:20:40.310878800Z
…
当我从流断开连接(关闭浏览器选项卡)时,抛出IOException,捕获并打印堆栈跟踪.
java.io.IOException: An established connection was aborted by the software in your host machine
…
我试过捕捉它,但它已被抓住,并没有让它回到我的方法.
我尝试将doOnTerminate(),doOnError()等添加到Flux但似乎没有任何影响,我猜测实际事件是不同的类型.
我可以以某种方式访问此异常以处理它不同于打印它吗? (我想避免在日志中输出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();
}
}
解决方法:
该异常与浏览器和控制器之间的HTTP连接处理有关(简单地说就是).
它可以在控制器的@ExceptionHandler方法中处理(或者在@ControllerAdvice类中处理,如果要在更多控制器上应用相同的异常处理).
例如:
@RestController
public class NowResource {
...
@ExceptionHandler(IOException.class)
public void handleException(IOException e) {
log.warn("IOException occurred: {}", e.getMessage());
}
}
标签:java,spring,reactor,spring-webflux 来源: https://codeday.me/bug/20190627/1304601.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。