2009-12-24 71 views
0

我在Servlet的是新的,我用下面的代碼讀一些的inputStream,如何讓servlet容器(Tomcat)中斷/銷燬servlet請求?

class MyServlet implements Servlet{ 
    void service(ServletRequest req, ServletResponse res){ 
    InputStream inA, inB, inC; 
    //... 
    inA.read(); // May block 
    inB.read(); // May block 
    inC.read(); // May block 
    // ... 
    } 
} 

如何讓servlet容器(Tomcat)的中斷/一些配置的時間後破壞MyServlet。在這種情況下,它會調用哪個方法?

在此先感謝,,,

+0

什麼是功能要求?現在,您正在問如何實現一個解決方案,您認爲這是您的功能需求的解決方案。但是這個解決方案有點發臭。你真的不想讓servlet運行幾分鐘,並且肯定不會有中斷請求的控制權。再次闡述功能需求,然後我們可以想出更好的解決方案。 – BalusC 2009-12-24 19:53:18

+0

對於問題,我的服務不應該處理超過特定的時間,如果是的話它應該終止。即什麼也不做,然後在規定的時間內重試直到成功。我希望我的功能要求很明確?謝謝 – mebada 2009-12-24 20:26:12

回答

1

您不要調用這些方法,容器。

我不知道爲什麼你會這樣做。你真的想重新閱讀這些文件與每個請求?如果你需要的內容,我寧願看到你在init方法中讀取它們並緩存它們。

+0

謝謝,,,怎麼容器中斷服務的servlet方法? 如果需要特定時間 的建議,我只需要中斷服務方法? – mebada 2009-12-24 20:03:24

+0

也許你可以使用java.nio來做到這一點,或者將它封裝在Timer中。但是servlet API不應該是解決方案的一部分。這是一個IO問題。 – duffymo 2009-12-24 20:07:05

+0

是定時器保存在servlet中使用? – mebada 2009-12-24 20:10:52

2

我不相信你可以使用Tomcat(或其他servlet引擎)來做到這一點。

最簡單的方法可能是在單獨的線程中產生耗時的進程,在該調用上調用該進程並超時。您可以使用FutureTask對象並在其上調用get()來輕鬆完成此操作,並指定超時。如果任務耗時過長,您將得到一個TimeoutException,並且您可以使用該servlet將此(很好地)報告給用戶。

例如(很簡單)

FutureTask f = new FutureTask(new Runnable{...}); 
try { 
    Object o = f.get(TIMEOUT, UNITS) 
    // report success 
} 
catch (TimeoutException e) { 
    // report failure 
} 
+0

是否使用servlet中的線程保存? – mebada 2009-12-24 19:04:16

+0

是的。對於這些問題,這不是問題和常見的解決方案 – 2009-12-24 19:05:50

0

這也許是不使用你自己的線程的最佳逼近:服務方法可以拋出javax.servlet.UnavailableException將信號集裝箱這個servlet不可用暫時或永久。