以下是问题的要求:
我正在尝试使用下面的servlet过滤器来解决问题。我有以下问题。
package com.exmaple;
@WebFilter("/*")
public class InitFilter implements Filter
{
private volatile boolean initialized = false;
public void destroy() {
System.out.println("InitFilter.destroy()");
}
// is this method thread safe and will only execute the init code once
// and will cause all requests to wait until initialization code is executed
// thread code
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("InitFilter.doFilter()");
if (initialized == false) {
synchronized (this) {
// do expensive initialization work here
initialized = true;
}
}
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("InitFilter.init()");
}
}
答案 0 :(得分:1)
我会将其作为ServletContextListener
处理并在contextInitialized
方法中运行初始化,作为单独的线程,可能使用FutureTask
作为@fge建议,或者{{1而不是一个游泳池。
也许有些事情......
newSingleThreadExecutor
这可以避免同步问题,只运行一次初始化。 (每个上下文一次)
无论如何,执行此操作或过滤器,程序的其余部分必须处理初始化不完整。
答案 1 :(得分:0)
我建议你把长时间运行的初始化放在一个线程中,比如:
public void init() throws ServletException {
//Configure logging, app, pool ...
MyAppStarter.getInstance().start();
}