如果servlet2
需要预计算的数据不依赖于servlet1
输入,只需要计算一次,要么在 中急切计算,要么在 中ServletContextListener.contextInitialized()
计算GenericServlet.init()
。但是,计算需要一些时间,您最好将其移动到某个后台线程以避免应用程序启动时间过长(这些方法会阻止部署,直到它们完成)。
这是一个简单的例子:
public class Servlet2 extends HttpServlet {
private final ExecutorService threadPool = Executors.newSingleThreadExecutor();
private Future<String> calculationResult;
@Override
public void init() throws ServletException {
calculationResult = threadPool.submit(new PreComputingTask());
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
final String slowResponse = calculationResult.get();
//...
}
}
class PreComputingTask implements Callable<String> {
@Override
public String call() throws Exception {
//Call external systems, whatever...
return "slow response";
}
}
如您所见,servlet2
启动时,它在单独的线程中启动预计算任务。然后在doGet()
你检索结果时,可能正在等待它,如果它还没有完成的话。
如果预计算依赖于输入(例如调用外部系统时需要使用servlet1
的请求参数),则更具挑战性和趣味性。servlet1
我看到至少两个选项: