如果未关闭,StreamingResponseBody 将重用 OutputStream。这是预期的吗?

agl*_*man 6 java spring

我注意到OutputStream如果 curl 请求是 ctrl+c,下面的代码将使用相同的对象(调试时相同的哈希代码),然后重新运行。即使使用不同的参数,它也使用相同的OutputStream. 这显然会导致非常奇怪的输出。

原始输出流NullPointerException在写入时开始抛出,OutputStream因为底层HttpOutputStream不再存在(管道损坏)。这就是为什么我认为后续请求会重用同一个OutputStream对象很奇怪。

在 finally 块中关闭输出流可解决此问题。我在网上看到的一些例子没有明确关闭输出流。是OutputStream预期的重用吗?有没有人对我为什么会看到这种行为有任何想法?

@RequestMapping(value= URI_ROOT, method= RequestMethod.POST, produces = {"text/event-stream"})
public StreamingResponseBody methodName(
    ... params
) {

    return new StreamingResponseBody() {
        @Override
        public void writeTo(OutputStream outputStream) {
            try {
                ... code ...
            } catch (Exception e) {
                LOGGER.info("Migration thread interrupted.",e);
            } finally {
                IoUtil.closeSilently(outputStream); // This fixes it.
            }

        }
    };

}
Run Code Online (Sandbox Code Playgroud)