在閱讀了很多不同的東西並且完全不熟悉這些東西中的正確術語之後,我想知道在創建線程時正確的方式是什麼tomcat啓動有特定用途。我正在使用一個linux系統。在啓動時在tomcat中創建任務線程的正確方法
我不想從一個servlet創建一個線程,並且我對這個不好的原因有個好主意。當tomcat啓動時,我想要兩個不同的線程有獨特的目的開始。第一個線程每隔30分鐘運行一次,以審計後端數據。第二個線程負責發送電子郵件。當請求運行一個必須發送電子郵件的servlet時,我不想阻止等待發送電子郵件的servlet,而是要發送一個請求到這個電子郵件線程並繼續前進。所以一個定期運行,一個按需運行。我從來不需要增加執行這些任務的線程數,我只需要這兩個就可以了,只要webapp正在運行,並且如果webapp必須停止,我就不會在意曼妙關掉。
有我知道我可以採取一些辦法:
以外的tomcat創建運行的過程和定義的方式與我的servlet這一進程進行通信。如果可能的話,我想避免這種情況,因爲我希望這兩個線程首先直接與啓動和關閉Web應用程序相關聯,並且他們能夠訪問
ServletContext
中的數據,而不是必須通過通信通道傳送/接收數據。在我的一個servlet的
init
方法中產生兩個線程。這看起來很骯髒和黑客,但它肯定會完成工作。創建一個
ServletContextListener
,它擴展了ThreadPoolExecutor
或其他ExexutorService
。這似乎有吸引力和正確的,我想我可以做一個固定的2線程線程池,因爲我不需要更多。但是,這是推薦的方式來做我想要的嗎?據我所知,ExecutorService
實際上更適用於執行Runnable
,而不必失去創建線程的開銷。我不知道這是否完全正確,但如果是這樣,我不會爲了其目的而使用執行者。
也許有更多的方法,我不知道或實現上述之一的正確方法。
首先,**這與Tomcat **無關,請編輯該問題。你的問題是你如何在_web application_中啓動服務線程。其次,你的第三種方法幾乎是正確的 - 但不要「擴展」,這當然是錯誤的。另外,考慮兩個聽衆,因爲這些聽衆似乎是各自關心的問題,將他們分組在一起也是一種駭客。確保你理解並使用'ScheduledExecutorService'並確保你正確關閉你的執行程序。 – 2014-09-29 13:45:14
聽起來像你真正想要的是兩個[Singleton](http://stackoverflow.com/q/70689/823393)s。 – OldCurmudgeon 2014-09-29 14:08:24
關於這個與tomcat無關的問題,我特別提到了tomcat,因爲我會嘗試在WebSphere中使用'WorkManager'來做這樣的事情,並且我會將'Work'傳遞給它。我不相信Tomcat本身具有這種能力(儘管我認爲JBOSS可能),所以我特別對像Tomcat這樣的輕量級servlet處理器的選擇感興趣。 – 2014-09-29 18:29:05