2013-01-22 36 views
7

我想問一下從java servlet運行一個長進程的最佳方法是什麼。我有一個web應用程序,當客戶端發出請求時,它運行一個servlet。這個servlet應該從請求中獲取一些參數,然後運行一個進程。這個過程可能需要很長時間,所以我需要單獨運行它。當這個過程完成後,它會發送一封包含結果的電子郵件。從java servlet運行一個長進程的最佳方法是什麼?

在此先感謝。

回答

5

使用線程池。每次收到請求時,都要創建一個任務並將其提交給線程池。這將確保太多的請求不會讓服務器癱瘓,因爲您控制了可以擁有多少個併發線程,以及線程池的等待任務隊列中有多少任務可以等待。

查看javadoc的ExecutorsThreadPoolExecutor

1

我看到兩種可能做到這一點:

  1. 爲每個任務(線程池的方式),一個單獨的線程。這是可能的,但可能會造成性能問題。
  2. 創建第二個應用程序。例如,您可以將參數保存到數據庫。第二個應用程序會以一定的時間間隔監視此數據庫,並執相反,DB,你可以使用一些消息隊列管理器一樣WebSphere MQ

第二條本辦法具備的優勢:如果應用程序不能現在由於某種原因處理請求,應用程序可以在稍後返回到

2

雖然這聽起來有點危險,即調用servlet會產生一個進程(沒有適當的限制能力),您可以使用Runtime.getRuntime().exec()產生一個進程。使用ProcessBuilder來準備過程參數併產生它們會更好。

2

通常,這種活動被委託給另一種類型的應用程序模塊,如消息驅動bean,這似乎是對我來說最乾淨和符合標準的解決方案。雖然大多數服務器不會抱怨,如果你創建自己的線程(這是標準禁止的,但很少強制執行),但我認爲設置自己的作業隊列和共享執行環境所需的管理量並不是真的值得。

相關問題