我正在尝试将遗留应用程序迁移到jee 7.作为部署的一部分,我们在启动服务器上加载了初始化几个缓存的负载。 Inturn这些缓存由其他类使用。
旧版实现按顺序初始化它们。我试图并行初始化它们以节省部署时间。
我正在使用ManagedThreadFactory.newThread(callable).start();
问题是,线程在部署之后或结束时开始初始化。这会导致其他类中的NPE取决于缓存。
有没有办法我可以并行初始化缓存,一旦初始化了缓存,部署的其余部分就应该继续。
答案 0 :(得分: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?
}
}