Jakarta ee ManagedThreadFactory不会立即启动线程

Jakarta ee ManagedThreadFactory不会立即启动线程,jakarta-ee,java-ee-7,java-threads,Jakarta Ee,Java Ee 7,Java Threads,我正在尝试将一个遗留应用程序迁移到jee 7。作为部署的一部分,我们有一个启动时加载servelt,它初始化了几个缓存。Inturn这些缓存由其他类使用 遗留实现按顺序初始化它们。我正在尝试并行初始化它们以节省部署时间 我正在使用ManagedThreadFactory.newThread(可调用).start() 问题是,线程在部署之后或部署结束时开始初始化。这会导致其他类中的NPE,具体取决于缓存 是否有任何方法可以并行初始化缓存,一旦缓存初始化,其余的部署应该继续。我建议更改以使用缓存。您

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

遗留实现按顺序初始化它们。我正在尝试并行初始化它们以节省部署时间

我正在使用ManagedThreadFactory.newThread(可调用).start()

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


是否有任何方法可以并行初始化缓存,一旦缓存初始化,其余的部署应该继续。

我建议更改以使用缓存。您可以在那里启动线程,但区别在于,您需要等待它们在
contextInitialized
方法中返回。这样,在servlet上下文初始化完成之前,servlet不会启动。老实说,这比一个启动servlet要好,而且在JEE7之前工作得很好

代码类似于:

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

非常感谢。我仍然想知道为什么ManagedThreadFactory没有立即启动线程。此外,我们稍后将用启动单例ejb替换启动Servlet。所以我不认为ServletContextListener是我的选择。我不确定为什么你认为线程没有启动——听起来像是启动了,但其他事情也在启动。由于启动时运行的servlet几乎是应用服务器所做的最后一件事,所以发生这种情况也就不足为奇了。启动EJB可能会工作,但最终您需要确保它在其他任务启动之前完成—您可能需要某种锁定机制来防止在缓存准备就绪之前使用它。