2017-10-04 70 views
0

我試圖創建一個異步servlet,以便客戶端發出請求,獲得像「進程啓動」的答案並停止等待。 servlet將啓動一些計算並將結果寫入數據庫,然後用戶將能夠檢查進程是否終止並查看其結果。關閉請求並啓動Java中的異步計算

那麼,每次我嘗試做到這一點就會得到錯誤。在請求中我有一個Connection對象,並且如果我將它傳遞給一個線程然後啓動它,當主Servlet結束連接時關閉並且線程拋出一個異常('連接已經關閉')。

有沒有辦法給客戶端一個響應,並告訴它不要等待servlet完成所有工作?

預先感謝您!

+0

請分享您的代碼。 –

+0

@chade我應該分享哪些代碼?我正在尋求一種辦法,而不是爲了解決錯誤...... –

+0

您可以讓您的客戶端使用Ajax或類似技術來執行異步請求。當存在回購時,回調機制將被用來獲得它。 – breezee

回答

0

如果你提到一個數據庫連接,爲什麼不創建連接內部你的線程?

+0

因爲我沒有連接的密碼。我正在爲我的社會開展一個大型項目,帶來了很多安全問題。如果有克隆已經有效的連接的方法將會很好 –

+1

你真的需要發佈你的「大項目」的更多細節來獲得幫助。你在使用Hibernate嗎?你在使用Spring事務管理器嗎? – Qianlong

+0

這是我最終採納的解決方案,謝謝 –

0

存在Ajax(JavaScript)在瀏覽器中發出呼叫,並在稍後收到成功/失敗的回調。這將是最常用的方式。

如果需要更多,在隊列中註冊調度請求=在數據庫中存儲某些內容。然後在你的應用程序中執行計時器任務(例如來自Spring)。這可以防止超載,DoS。

+0

我不需要將請求放在隊列中。如果我使用Ajax,並且用戶關閉了它的瀏覽器,servlet是否仍然會執行到最後? –

+0

是一直處理到最後(否則有時不合需要)。我的意思是「隊列」,如果處理需要很長時間,只需將其所需的任務與其參數一起存儲起來,基於定時器的處理就會更好。 –

0

實際上,如果您在關閉響應輸出流(或寫入器)時將響應完全發送到客戶端,並且您可以在servlet內部繼續進行處理而不存在任何線程問題。不幸的是,我永遠不能發現一個確認,如果在servlet規範中明確允許,但我可以在Tomcat中成功地執行它(使用版本7)

因此,您提供了一個大膽的註釋,您的servlet代碼可能看起來像:

void service(ServletRequest req, ServletResponse resp) { 
    OutputStream out = res.getOutputStream(); 
    ... // generate the output 
    out.close();  // the response is sent to client 
    // asynchonous processing 
    ... 
} 
+0

如果客戶收到回覆後關閉瀏覽器會怎麼樣?服務器可能注意到套接字被客戶關閉並且終止了進程,不是嗎? –

+0

我不這麼認爲,因爲HTTP是一個斷開的協議。 –