java.io.IOException: Stream closed

java.io.IOException: Stream closed

场景:在使用输入流获取请求体中的数据时抛出IOException

原因:

@Async(AppConstant.ASYNC_POOL)
public void recognize(HttpServletRequest request) {
    try (InputStream is = request.getInputStream()) {
        byte[] buffer = new byte[1024];
        int length;
        StringBuilder stringBuilder = new StringBuilder();
        while ((length = is.read(buffer)) != -1) {
            stringBuilder.append(new String(buffer, 0, length));
        }
        // 处理数据...
    }
}

问题就出在@Async(AppConstant.ASYNC_POOL)注解上,意思是使用异步执行该方法,如果在还未读取完输入流中的数据时,请求已经结束,那么就会导致输入流关闭,最后抛出java.io.IOException: Stream closed异常。

解决方法:读取请求体中的数据操作使用同步操作,后面的处理数据操作单独提成一个方法,做异步操作。

public void recognize(HttpServletRequest request) {
    try (InputStream is = request.getInputStream()) {
        byte[] buffer = new byte[1024];
        int length;
        StringBuilder data = new StringBuilder();
        while ((length = is.read(buffer)) != -1) {
            data.append(new String(buffer, 0, length));
        }
        handler(data);
    }
}
@Async(AppConstant.ASYNC_POOL)
public void handler(String data) {
    // 处理数据...
}