我有一个 servlet,用于一个需要几分钟才能完成的漫长过程。收到对此 servlet 的请求后,将在线程内执行长进程,以便由于超时问题立即将响应发送回客户端:
public class TestServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
//Thread safe code
Thread thread = new Thread() {
public void run() {
try {
Thread.sleep(10000); //simulate long processing
} catch(InterruptedException v) {
}
}
};
thread.start();
}
}
这意味着每次我收到请求时,都会创建一个新线程。为了不遇到攻击的风险,我需要控制允许的线程数。这意味着在上下文中有一个池,并在所有线程都繁忙时实现快速故障。
我正在查看执行器界面。我的问题是,我如何实现此线程池执行器可从收到的所有请求中访问并充当所有线程的队列?我是否应该将执行器声明为 servlet 中的局部非线程安全变量,以便此 servlet 的所有实例都可以访问,如下所示?
public class TestServlet extends HttpServlet {
//non-thread safe variables
//declare executor here
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
//instantiate executor in case it is null
Thread thread = new Thread() {
public void run() {
try {
Thread.sleep(10000); //simulate long processing
} catch(InterruptedException v) {
}
}
};
//add thread to the executor
}
}
或者是否可以在上下文级别声明此执行器?
我还在看Tomcat Executor,我相信Tomcat本身使用它来管理它的线程。是否也可以将这些线程添加到此执行器中?
通常在应用服务器中执行显式线程管理是一个坏主意。您可以将 servlet 设置为在新线程本身中运行,从而避免将内容转移到 servlet 中的另一个线程。我还没有查过Tomcat是否允许你配置允许的Servlet的最大同时实例数,所以这可能仍然是一个问题。
如果你确实显式使用"Thread.sleep((",请不要像那样放弃"InterruptedException"。这是错误的做法。查找正确的内容(处理并重新中断(。