导致这个WildFly / Undertow损坏管道错误的原因是什么?

时间:2014-09-26 14:09:48

标签: wildfly-8

我在NetBeans下运行的WildFly 8.1.0.Final安装中看似随机出现以下错误:

08:51:09,742 ERROR [io.undertow.request] (default task-40) Blocking request failed   HttpServerExchange{ GET /web/faces/javax.faces.resource/dynamiccontent.properties}:   java.lang.RuntimeException: java.io.IOException: Broken pipe
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:177)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:727)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_20]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_20]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_20]
Caused by: java.io.IOException: Broken pipe
at sun.nio.ch.FileDispatcherImpl.write0(Native Method) [rt.jar:1.8.0_20]
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) [rt.jar:1.8.0_20]
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) [rt.jar:1.8.0_20]
at sun.nio.ch.IOUtil.write(IOUtil.java:65) [rt.jar:1.8.0_20]
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:470) [rt.jar:1.8.0_20]
at org.xnio.nio.NioSocketConduit.write(NioSocketConduit.java:150) [xnio-nio-3.2.2.Final.jar:3.2.2.Final]
at io.undertow.server.protocol.http.HttpResponseConduit.write(HttpResponseConduit.java:531)
at io.undertow.conduits.ChunkedStreamSinkConduit.flush(ChunkedStreamSinkConduit.java:256)
at org.xnio.conduits.ConduitStreamSinkChannel.flush(ConduitStreamSinkChannel.java:162) [xnio-api-3.2.2.Final.jar:3.2.2.Final]
at io.undertow.channels.DetachableStreamSinkChannel.flush(DetachableStreamSinkChannel.java:100)
at org.xnio.channels.Channels.flushBlocking(Channels.java:63) [xnio-api-3.2.2.Final.jar:3.2.2.Final]
at io.undertow.servlet.spec.ServletOutputStreamImpl.close(ServletOutputStreamImpl.java:625)
at io.undertow.servlet.spec.HttpServletResponseImpl.closeStreamAndWriter(HttpServletResponseImpl.java:451)
at io.undertow.servlet.spec.HttpServletResponseImpl.responseDone(HttpServletResponseImpl.java:525)
... 9 more

请求的页面似乎加载没有问题,所以除了日志中的例外,我还没有注意到任何中断。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,感谢this response的想法,我提出了一点点。我要公开我的案子。

我正在使用Java(Java 7)(javax.ws.rs)创建REST API并将其部署在JBoss服务器(8.x)上。

我的Api响应这些路径:

  • /myapi/a
  • /myapi/a?filer=myfilter

所以我这样编码:

private static final String FILTER = "filter";

@GET
@Path("/a")
@Produces(MediaType.APPLICATION_JSON)
public Object
foo(@Context UriInfo requestInfo) {
    LOG.info("Http request: GET /myapi/a");
    if (requestParameters.getQueryParameters().containsKey(FILTER)) {
            return foo(requestInfo.getQueryParameters().get(FILTER));
    } 
    // no params
    return ...
}


public Object foo(List<String> filter) {
    LOG.info(" > Requested filter"); 
    return ...;
}

但是我从服务器(而不是我的代码)得到有时这个异常 由UT005023: Exception handling request to ... sessionState: org.jboss.resteasy.spi.UnhandledException: Response is committed, can't handle exception

引起的java.io.IOException: Broken pipe

调查它我遇到了一些非常有趣的东西:它只能从Safari浏览器重现它,而不是Chrome。所以呢?关键是Safari具有Chrome不具备的功能:当Safari自动完成请求时,会发送请求。在按下 enter 按钮之前,Chrome不会发送请求。这很重要,因为只有在以下情况下才会出现错误:

  1. 使用Safari的自动填充请求/ a?filter = f
  2. 请求(按回车)到/ a
  3. 此时,我不知道原因(这是与http标题相关的内容)=&gt;作为stephen-c,问题在于,您正在尝试执行需要更改HTTP响应标头的内容...在标头发送后

    [EDITED]

    我几乎肯定(99%)我们无法处理该异常。基本上它说你丢失了一个请求,并且作为警告,服务器告诉你你不会处理它。

    还有另一种方法可以重新创建例外:尝试将手指放在F5CMD-R。您将创建数百个请求...但是您将失去其中一些(与池线程,工作人员等相关)并且您将看到这些丢失请求的异常。

    我决定不再担心这件事了。

答案 1 :(得分:2)

我有相同的警告,但仅限于Firefox。 Daniel.lichtenberger的post很好地解释了这个问题以及解决方法。

总而言之,Firefox的RCWN同时发出两个请求并取消最慢的请求,从而导致管道中断警告。要禁用RCWN,请在Firefox中输入about:config并禁用network.http.rcwn.enable

答案 2 :(得分:0)

如果您要在IE中发送多部分/表单数据请求, 您必须像这样将隐藏类型附加到表单上

        <form>
...
            <!-- for IE -->
            <input type='hidden' name='_4ie' value='for IE'>
        </form>