2015-04-21 122 views
1

我開發了一個播放音頻和視頻文件的Web應用程序。用戶可以更改當前正在播放的曲目,在這種情況下,客戶端會爲HTML 5播放器設置新的來源。應用程序的分佈採用嵌入式碼頭9,和其他環境中運行WildFly 8Java/Jetty/Wildfly:處理異常終止的客戶端連接

的應用程序工作正常,但是當用戶更改軌道WildFly問題,該堆棧跟蹤:

java.io.IOException: An established connection was aborted by the software in your host machine 
    at sun.nio.ch.SocketDispatcher.writev0(Native Method) [rt.jar:1.7.0_75] 
    at sun.nio.ch.SocketDispatcher.writev(SocketDispatcher.java:55) [rt.jar:1.7.0_75] 
    at sun.nio.ch.IOUtil.write(IOUtil.java:148) [rt.jar:1.7.0_75] 
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:524) [rt.jar:1.7.0_75] 
    at org.xnio.nio.NioSocketConduit.write(NioSocketConduit.java:161) 
    at io.undertow.server.protocol.http.HttpResponseConduit.write(HttpResponseConduit.java:609) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    at io.undertow.conduits.AbstractFixedLengthStreamSinkConduit.write(AbstractFixedLengthStreamSinkConduit.java:148) [undertow-core-1.1.0.Final.jar:1.1.0.Final] 
    ... 

和Jetty拋出類似的錯誤:

org.eclipse.jetty.io.EofException 
    at org.eclipse.jetty.io.ChannelEndPoint.flush(ChannelEndPoint.java:192) 
    at org.eclipse.jetty.io.WriteFlusher.flush(WriteFlusher.java:408) 
    at org.eclipse.jetty.io.WriteFlusher.write(WriteFlusher.java:302) 
    at org.eclipse.jetty.io.AbstractEndPoint.write(AbstractEndPoint.java:128) 
    ... 
Caused by: java.io.IOException: Broken pipe 
    at sun.nio.ch.FileDispatcherImpl.write0(Native Method) 
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) 
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) 
    at sun.nio.ch.IOUtil.write(IOUtil.java:65) 

這是有道理的 - 是的,客戶端已經終止以前的源文件,併發出下一個文件的GET請求的連接,但是這是應用程序的預期操作。

有沒有辦法妥善處理這個問題並避免這些錯誤?

+1

您確定您使用的是Jetty? 'io.undertow.server.protocol.http'表示你正在使用Undertow類似的項目,但不是Jetty。 –

+0

好的@JoakimErdfelt,你是對的。我使用的是WildFly和Jetty,我最初發布的是用於WildFly的。編輯問題以添加兩個堆棧跟蹤。 – bdunn

回答

2

如果在應用程序正在進行的調用中拋出異常,請捕獲IOException並處理它的方式 - 可能是通過從您的代碼正在執行的任何操作中返回而不抱怨。

Tomcat具有org.apache.catalina.connector.ClientAbortException,因此您可以分辨此IOException和其他IOException之間的區別,但沒有由Servlet規範定義的可移植異常。

如果在純容器代碼(例如IO工作線程)中發生異常,那麼我會提出一個錯誤,指出客戶端會斷開連接,因此異常不應該高於調試/跟蹤級別。

相關問題