簡體   English   中英

由於集群時可能出現的問題,Servlet不應該啟動線程......什么問題?

[英]Servlets should not start threads due to issues that may arise when clustering …what issues?

我知道我們不應該在servlet中啟動線程,因為線程應該由容器管理。 如果容器被告知關閉,如果有線程,它不知道掛在它周圍不會關閉。 我通過使它成為一個守護程序線程來解決這個問題...

但除了上面的“無法關閉”情況之外,還有什么其他原因可能不允許servlet啟動線程。 我看到有人提到,如果環境是聚集的,它將導致問題。 但是,沒有實際可能會發生的事情可能是不好的。

編輯:目前這是在一個servlet中完成的,我很難說服這段代碼的作者不是一個好主意。 一個人必須理解復雜性的論點是不會飛的......我正在尋找一個具體的具體案例,當一些不好的事情發生時,不打算這樣做

在我的情況下:有問題的servlet啟動了n個線程,這種情況發生在集群上的每個vm中。 沒有交易要求

官方常見問題解答

為什么不允許創建和管理線程?

EJB規范為EJB容器分配管理線程的責任。 允許企業bean實例創建和管理線程會干擾容器控制其組件生命周期的能力。 線程管理不是業務功能,它是一個實現細節,通常是復雜的和特定於平台的。 讓容器管理線程可以減輕企業bean開發人員處理線程問題的麻煩。 多線程應用程序仍然可行,但多線程控制位於容器中,而不是企業bean中。

也就是說,如果不考慮啟動和關閉的問題,那么從某種意義上說,線程是一個實現細節 ,而且多線程被認為是一個可擴展性問題,應該進行管理,這在一定程度上是一個“哲學”問題。通過應用程序。 服務器。

例如,大多數應用程序。 服務器允許集成商定義池並配置線程數等。生成線程的應用程序本身會逃避此配置 ,並且在可伸縮性計划中不能很好地協作。

此外,如果您希望在群集環境中使用單個后台線程 ,則會變得棘手。

最后,應用程序。 服務器控制事務 如果您自己生成線程,則必須注意了解可安全使用的所有詳細信息(例如,從池中獲取連接)以及如何在必要時使用UserTransaction 我們的想法是,如果您使用應用程序,則不必擔心此類細節。 服務器,但如果你自己開始處理線程,你將需要。

然而,我看到Web應用程序從ServletContextListener一個后台線程,猜猜是什么,這很好,即使應用程序部署在多個節點上也是如此。 您只需要了解運行多個JVM意味着什么,並確保您正確支持它。

根據您的使用情況,有很多問題。 如果您的線程/作業正在運行的群集中的特定服務器崩潰,這會使您的線程消失,那會是一件壞事嗎? 是否應該通知某人? 作業應該轉移到群集中的另一台服務器嗎? 一旦服務器再次啟動,它應該重新啟動嗎? 所有這些,你必須在你的線程中實現....或者你可以使用JMS,它甚至可以在Tomcat中運行,使用ActiveMQ的插件,或者你選擇的其他一些消息容器,然后編寫代碼執行你的邏輯,讓容器擔心所有其余的。 因人而異

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM