ManagedThreadFactory不会立即启动线程

时间:2017-04-03 13:17:26

标签: java-ee java-ee-7 java-threads

我正在尝试将遗留应用程序迁移到jee 7.作为部署的一部分,我们在启动服务器上加载了初始化几个缓存的负载。 Inturn这些缓存由其他类使用。

旧版实现按顺序初始化它们。我试图并行初始化它们以节省部署时间。

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

问题是,线程在部署之后或结束时开始初始化。这会导致其他类中的NPE取决于缓存。

有没有办法我可以并行初始化缓存,一旦初始化了缓存,部署的其余部分就应该继续。

1 个答案:

答案 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?
    }
}