2017-04-03 83 views
0

我正在嘗試將遺留應用程序遷移到jee 7.作爲部署的一部分,我們在啓動servelt時初始化少量高速緩存。 Inturn這些緩存被其他類使用。ManagedThreadFactory不會立即啓動線程

傳統實現會按順序初始化它們。我正在嘗試並行初始化它們以節省部署時間。

我正在使用ManagedThreadFactory.newThread(callable).start();

問題是,線程正在部署後或開始部署時開始初始化。這會導致其他類中的NPE取決於高速緩存。

有沒有什麼辦法可以並行初始化緩存,一旦緩存初始化,剩下的部署應該繼續。

回答

1

我建議改變使用ServletContextListener。你會在那裏開始你的線程,但不同之處在於你會等待他們回到contextInitialized方法中。這樣,只有在servlet上下文完成初始化之後,您的servlet纔會啓動。老實說,這比一個啓動的servlet更好的和行之有效的JEE 7

代碼之前會是這樣的:

import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.annotation.WebListener; 

@WebListener 
public class YourContextListener implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     // create the caches - you can still thread them for faster startup 
     // but don't return until they are all initialized 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
     // tear down the caches? 
    } 
} 
+0

謝謝。我仍然想知道爲什麼ManagedThreadFactory沒有立即啓動線程。另外,我們將在稍後使用啓動單例ejb替換啓動Servlet。所以我不認爲ServletContextListener是我的選擇。 –

+0

我不知道你爲什麼認爲這些線索並未開始 - 聽起來像是這樣,但其他事情也開始了。由於在啓動時運行的servlet是關於應用服務器的最後一件事情,所以難怪這發生了。啓動EJB可能工作,但最終需要確保在其他任務啓動之前完成它 - 您可能需要某種鎖定機制來防止在準備好之前使用緩存。 – stdunbar