我想問一下從java servlet運行一個長進程的最佳方法是什麼。我有一個web應用程序,當客戶端發出請求時,它運行一個servlet。這個servlet應該從請求中獲取一些參數,然後運行一個進程。這個過程可能需要很長時間,所以我需要單獨運行它。當這個過程完成後,它會發送一封包含結果的電子郵件。從java servlet運行一個長進程的最佳方法是什麼?
在此先感謝。
我想問一下從java servlet運行一個長進程的最佳方法是什麼。我有一個web應用程序,當客戶端發出請求時,它運行一個servlet。這個servlet應該從請求中獲取一些參數,然後運行一個進程。這個過程可能需要很長時間,所以我需要單獨運行它。當這個過程完成後,它會發送一封包含結果的電子郵件。從java servlet運行一個長進程的最佳方法是什麼?
在此先感謝。
使用線程池。每次收到請求時,都要創建一個任務並將其提交給線程池。這將確保太多的請求不會讓服務器癱瘓,因爲您控制了可以擁有多少個併發線程,以及線程池的等待任務隊列中有多少任務可以等待。
查看javadoc的Executors和ThreadPoolExecutor。
我看到兩種可能做到這一點:
WebSphere MQ
第二條本辦法具備的優勢:如果應用程序不能現在由於某種原因處理請求,應用程序可以在稍後返回到
雖然這聽起來有點危險,即調用servlet會產生一個進程(沒有適當的限制能力),您可以使用Runtime.getRuntime().exec()
產生一個進程。使用ProcessBuilder
來準備過程參數併產生它們會更好。
通常,這種活動被委託給另一種類型的應用程序模塊,如消息驅動bean,這似乎是對我來說最乾淨和符合標準的解決方案。雖然大多數服務器不會抱怨,如果你創建自己的線程(這是標準禁止的,但很少強制執行),但我認爲設置自己的作業隊列和共享執行環境所需的管理量並不是真的值得。