2012-02-12 88 views
0

我使用一個基於servlet的碼頭做RPC,我有一個問題,需要較長時間的請求拋出服務器上的以下異常:問題與SocketTimeoutException和Jetty

2012- 02-11 21:07:07,673 [btpool0-4] DEBUG org.mortbay.log - EXCEPTION java.net.SocketTimeoutException:讀取超時 at java.net.SocketInputStream.socketRead0(Native Method) at java.net。 SocketInputStream.read(Unknown Source) at org.mortbay.io.ByteArrayBuffer.readFrom(ByteArrayBuffer.java:168) at org.mortbay.io.bio.StreamEndPoint.fill(StreamEndPoint.java:99) at org.mortbay.jetty.bio.SocketConnector $ Connection.fill(SocketConnector .java:190) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:277) at org.mortbay.jetty.HttpParser .parseAvailable(HttpParser.java:203) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:357) at org.mortbay.jetty.bio.SocketConnector $ Connection.run(SocketConnector。 java:217) at org.mortbay.thread.BoundedThreadPool $ PoolThread.run(BoundedThreadPool .java:475)2012-02-11 21:07:07,674 [btpool0-4] DEBUG org.mortbay.log - EOF

我試着設置Connection,Keep-Alive http請求屬性,但是沒有任何效果,從我能收集的信息來看,http 1.1(我很確定我使用的是)默認是持久的。

因此,我認爲有2種方式我可以嘗試解決這個問題:

  1. 弄清楚如何防止超時異常被 在所有
  2. 扔在客戶端問題,而初始請求等待 的迴應,然後用平單獨的請求,檢查時 服務器完成。

    更新(2012/2/12):我設置maxIdleTime蒂姆建議並沒有延長時間發生超時之前,但後來我開始一個新的異常:

2012 -02-11 23:24:01187 [btpool0-1] DEBUG org.mortbay.log - 異常 java.io.IOException的:一個現有的連接被強制通過在sun.nio.ch.SocketDispatcher.read0的 遠程主機關閉(本機方法)在 sun.nio.ch.SocketDispatcher.read(來源不明)維持在 sun.nio.ch.IOUtil.readIntoNativeBuffer(來源不明) sun.nio.ch.SocketChannelImpl.read(Unknown Source)at org.mortbay.io.nio.ChannelEndPoint.fill(ChannelEndPoint.java:129)at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:277)處 org.mortbay.jetty.HttpConnection.handle org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:203)(HttpConnection.java :357)at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:329) at org.mortbay.thread.BoundedThreadPool $ PoolThread.run(BoundedThreadPool。java:475)

因此,Jetty之外的某些東西正在導致連接中斷,我懷疑它很可能是防火牆。所以我最終做的是讓服務器用多個線程處理請求;原始線程會立即響應http請求,並且第二個線程將被啓動以執行需要很長時間的操作。然後,客戶端將使用http請求進行輪詢,以檢查服務器上的操作何時完成。

+0

什麼版本? – Tim 2012-02-12 04:57:28

+0

更快地提出請求。 – Bill 2012-02-12 05:04:33

回答

4

這是一個套接字超時,所以在HTTP級別上你沒有做任何事情可以解決它 - 因此你的活着沒有實現任何東西。

嘗試設置maxIdleTimeSocketConnector

在這裏看到:碼頭的http://docs.codehaus.org/display/JETTY/Configuring+Connectorsarchive link

+0

請參閱操作的全分辨率... – opike 2012-02-12 22:53:57

+1

Codehaus已被終止..沒有足夠的廣告收入來支付託管和維護費用:(所以上面的鏈接不再有效。 – Farah 2015-12-10 11:07:58