在像Tomcat或Jetty这样的准系统容器中,你最安全的赌注是使用具有最大线程量的应用宽线程池,以便任务在必要时排队。ExecutorService
在这方面非常有帮助。
在应用程序启动或 Servlet 初始化时,使用 Executors
类创建一个:
executor = Executors.newFixedThreadPool(10); // Max 10 threads.
然后在 servlet 的服务期间(您可以忽略您不感兴趣的情况的结果,或者将其存储在会话中以供以后访问):
Future<ReturnType> result = executor.submit(new YourTask(yourData));
哪里必须实现 or 和 可以看起来像这样,其中只是你的数据,例如,用请求参数值填充(请记住,你绝对不应该传递 Servlet API 工件,如 or!):YourTask
Runnable
Callable
yourData
HttpServletRequest
HttpServletResponse
public class YourTask implements Runnable {
private YourData yourData;
public YourTask(YourData yourData) {
this.yourData = yourData;
}
@Override
public void run() {
// Do your task here based on your data.
}
}
最后,在应用程序关闭或 servlet 销毁期间,您需要显式关闭它,否则线程可能会永远运行并阻止服务器正确关闭。
executor.shutdownNow(); // Returns list of undone tasks, for the case that.
如果您实际上使用的是普通的JEE服务器,例如WildFly,Payara,TomEE等,其中EJB通常可用,那么您可以简单地将注释放在从servlet调用的EJB方法上。您可以选择让它返回带有具体值的 a。@Asynchronous
Future<T>
AsyncResult<T>
@Asynchronous
public Future<ReturnType> submit() {
// ... Do your job here.
return new AsyncResult<ReturnType>(result);
}
另请参阅: