2017-04-03 31 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