2012-07-10 40 views
0

我正在做一個將Java作爲前端並將shell腳本作爲後端的web應用程序。這個概念是我需要在後端處理多個文件。我會得到用戶的日期範圍(例如7月1日至8日)和每天處理大約100個文件的日期範圍。所以總共有800個文件需要處理。java中的多線程web應用程序

我將從JSP中獲取這些詳細信息,並將後臺調用委託給shell腳本並取回結果並將其顯示給用戶。

現在我用順序方法完成了所有這些 - 我的意思是沒有線程。所以只有一個主線程執行,用戶必須等待直到800個文件被順序處理。然而這真的很慢。正因爲如此,我正在考慮去尋找線索。由於我線程的初學者,我閱讀了有關這個東西的一些,我想出了以下的想法:

當我讀線程的工作已經被分裂。我想分裂 8天的工作4個線程,每個線程將執行2天工作


我想知道我是否遵循正確的方法,我的主要問題是:

  1. 是它推薦從Web應用程序
  2. 產生多個線程這是否是一個好方法

如何用這個進行一些指導。一個示例實例會很棒。謝謝。

回答

0

是的,您可以在多線程或任何高性能環境中運行長處理作業。您還應該使用Servlet 3.0 Asynchronous Request Processing來掛起請求線程並等待Long處理任務完成。

0
  1. 是的,從Web應用程序產生多個線程沒有任何問題。事實上,如果你正在運行一個Servlet容器(自從你使用Java以來​​你最可能的),它已經爲你產生了多個線程。一般來說,一個Servlet容器會自動產生一個新的線程(或者重用一個池)來處理它接收到的每個請求。如果給定系統的硬件配置以及Web服務上的併發負載量,則認爲您需要對線程數進行微調,使其適合某些適合的內容。還要注意的是,在旋轉一堆線程的同時會減少處理所有數據所需的總時間,但在任何數據準備好返回給用戶之前,它仍會留下大量時間。因此,您可以通過按順序執行更小的工作單元來獲得更好的結果,並在每次準備就緒後將每批結果發佈到用戶界面。然後,用戶需要很長時間才能獲得所有數據,但幾乎可以立即開始查看至少一部分數據。

0

在Web應用程序中創建線程不是一個好的解決方案。這是一個糟糕的設計,因爲通常它是負責該活動的容器(網絡服務器)。所以我認爲你必須找到另一個解決方案。

我建議你把shell腳本放在cron中,計劃每分鐘運行一次,爲了「激活」它們,你可以觸摸作爲信號燈的文件。在每次運行時,腳本會驗證Web應用程序是否觸及信號量文件,如果是這樣,他們會從這些文件中讀取日期間隔,然後開始處理。

0

改善用戶體驗的方法不是通過在100000個線程上的Servlet級別並行化,而是爲視圖提供增量呈現。首先,根據例如MVC模式,將應用程序分成多層是有用的。

話說,你將不得不把眼光放在

  • 如何創建一個服務,它能夠返回部分答案,最後的答案,這意味着所有可用數據已經返回。每個答案可以並行計算以提高性能。

  • 通過回調此服務返回一個JSON字符串,用於將數據添加到DOM,從而逐步填充網頁。每當你得到答案時,如果這是一個部分答案,你再次調用提供前一個序列號的服務。

如果你期待Liligo理解,你會看到這是如何工作的。我描述的技術稱爲輪詢,但還有其他技術可以在UI級別獲得類似的異步結果。一般來說,你不想直接使用Servlet API,這是一個非常低級的API,而是使用一個合理的框架或抽象。

如果你想得到一個溫暖的建議,你應該看看Play!框架http://www.playframework.org/documentation/2.0.2/JavaStream HTTP流。