【发布时间】:2013-08-29 14:16:57
【问题描述】:
我们在服务器启动或应用程序部署时遇到了初始化缓存的问题。初始化缓存涉及
- 查询数据库以获取项目列表
- 为每个项目进行 rmi 调用
- 收听 JMS 队列/主题上的数据
- 构造缓存
这个初始化过程在启动代码中。所有这些都需要大量时间,因为部署需要大量时间或服务器启动时间正在增加。
所以我的建议是在启动时创建一个线程并在其中运行初始化代码。我编写了一个示例应用程序来演示它。
它涉及一个 ServletContextListener,一个过滤器。在侦听器中,我正在创建一个新线程,HeavyProcess 将在其中运行。当它完成时,将触发过滤器正在侦听的事件。收到事件后,过滤器将允许传入的 http 请求。在此之前,过滤器会将所有客户端重定向到默认页面,该页面显示应用程序正在初始化的消息。
我提出了这种方法,但很少有人提出担忧。
- 理想情况下,我们不应该创建线程,因为处理线程会很困难。
我的问题是为什么我们不能在 Web 应用程序中创建这样的线程。
如果这不好,那么最好的方法是什么?
【问题讨论】:
-
请澄清:servlet container only 或 EJBs allowed 的解决方案?哪个应用服务器(包括版本)?
-
我们正在使用 EJB 3.0 和 Glassfish 3.1.2.2 应用服务器。到目前为止,我们一直在使用 @Startup 注释,这延迟了部署。我使用 servlet api 给出了上述解决方案。
标签: multithreading jakarta-ee webserver