gpt4 book ai didi

java - 野蝇:org.xnio.channels.FixedLengthOverflowException

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:48:09 35 4
gpt4 key购买 nike

到目前为止,我们使用的是 JBoss AS 7.1,它有一个 tomcat 作为前端服务器。我们现在升级到 Wildfly (JBoss 8.0),它附带 undertow 作为 tomcat 的替代品。

对于我们的文件下载,我们正在读取文件的输入流,并将其写入外部上下文的响应输出流。这在 JBoss AS 7.1 中运行良好——即使对于大文件也是如此。在 Undertow 中,即使对于非常“小”的文件,我们也会收到以下异常:

13:04:43,292 ERROR [io.undertow.request] (default task-15) Blocking request failed HttpServerExchange{ GET /project/getFile.xhtml}: java.lang.RuntimeException: org.xnio.channels.FixedLengthOverflowException
at io.undertow.servlet.spec.HttpServletResponseImpl.responseDone(HttpServletResponseImpl.java:527)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:287)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:168)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:687)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_51]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_51]
at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_51]
Caused by: org.xnio.channels.FixedLengthOverflowException
at io.undertow.conduits.AbstractFixedLengthStreamSinkConduit.write(AbstractFixedLengthStreamSinkConduit.java:97)
at org.xnio.conduits.Conduits.writeFinalBasic(Conduits.java:132) [xnio-api-3.2.0.Final.jar:3.2.0.Final]
at io.undertow.conduits.AbstractFixedLengthStreamSinkConduit.writeFinal(AbstractFixedLengthStreamSinkConduit.java:137)
at org.xnio.conduits.ConduitStreamSinkChannel.writeFinal(ConduitStreamSinkChannel.java:104) [xnio-api-3.2.0.Final.jar:3.2.0.Final]
at io.undertow.channels.DetachableStreamSinkChannel.writeFinal(DetachableStreamSinkChannel.java:172)
at io.undertow.servlet.spec.ServletOutputStreamImpl.writeBufferBlocking(ServletOutputStreamImpl.java:580)
at io.undertow.servlet.spec.ServletOutputStreamImpl.close(ServletOutputStreamImpl.java:614)
at io.undertow.servlet.spec.HttpServletResponseImpl.closeStreamAndWriter(HttpServletResponseImpl.java:451)
at io.undertow.servlet.spec.HttpServletResponseImpl.responseDone(HttpServletResponseImpl.java:525)
... 9 more

getFile.xhtml 正在调用下载,以下代码用于复制流:

(删除了 Try、catch、日志和错误处理以节省一些空间)

public void downloadFile(FileEntity fileEntity) {
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();

ec.responseReset();
ec.setResponseContentType(getMimeType(fileEntity.getFile()));
ec.setResponseContentLength(new Long(fileEntity.getFile().length()).intValue());
ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + ConversionHelper.validateFilename(fileEntity.getDisplayFileName()) + "\"");

OutputStream output = ec.getResponseOutputStream();
FileInputStream fis = new FileInputStream(fileEntity.getFile());

IOUtils.copy(fis, output);

fc.responseComplete();
}

我注意到去掉那行

ec.setResponseContentLength(new Long(fileEntity.getFile().length()).intValue());

让它再次工作。然而 ResponseConentLength 是“正确的”。使用

ec.setResponseContentLength(new Long(fileEntity.getFile().length()).intValue() + 9);

(注意 +9)解决了这个问题。使用+8 -> FixedLengthOverflow,使用+10 -> FixedLengthUnderflow

+9 与文件大小无关。任何想法?我觉得很奇怪...

最佳答案

如果您调用 output.close() 它应该会产生您想要的效果。这看起来像是 JSF 的问题,与 Undertow 无关。

关于java - 野蝇:org.xnio.channels.FixedLengthOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23540360/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com