如何在reactor-netty服务端读取请求体并解决block()阻塞报错问题
错误原因
Reactor Netty 基于全异步非阻塞的响应式模型设计,其内置的IO线程(reactor-http-nio-* 线程)不允许执行任何阻塞操作,你代码中调用 mono.block() 属于阻塞操作,直接触发了框架的线程防护校验,因此抛出对应异常。
解决方案
不需要通过阻塞的方式获取请求体,直接利用响应式流的链式操作,在请求体读取完成后再构造返回响应即可,修改后的可运行代码如下:
public static void main(String[] args) throws IOException { Consumer<Throwable> onError = (Throwable ex) -> { System.out.println(ex.getMessage()); }; Runnable onCompletion = () -> { System.out.println("Message Completed"); }; DisposableServer server = HttpServer.create() .handle((httpServerRequest, httpServerResponse) -> // 全程走非阻塞链式处理,无需主动阻塞 httpServerRequest.receive() .aggregate() .asByteArray() .doOnNext(bytes -> { // 此处可直接获取请求体字节数组,做打印、解析逻辑都可在此处处理 System.out.println("读取到的请求体内容:" + new String(bytes)); }) .doOnError(onError) .doOnTerminate(onCompletion) .flatMap(bytes -> { // 此处可根据请求体内容自定义响应内容,示例:匹配请求体返回对应内容 String respContent; if("12312321312".equals(new String(bytes))){ respContent = "已匹配到你传入的请求体内容"; }else { respContent = "Hello world"; } return httpServerResponse.sendString(Mono.just(respContent)); }) ) .host("localhost") .port(45441) .bindNow(); System.in.read(); server.disposeNow(); }
验证方式
直接使用你原有的curl命令调用即可,代码运行后调用curl可以正常拿到响应,控制台也会输出你传入的请求体内容。
内容的提问来源于stack exchange,提问作者Lorna
相关产品推荐
相关产品推荐

