我有一个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();
}
}
这意味着每次收到请求时,都会创建一个新线程。为了不遭受攻击的风险,我需要控制允许的线程数。这意味着在上下文中有一个池,并且如果所有线程都忙,则实现快速失败。
我正在查看Executor界面。我的问题是,我如何实现这个线程池执行器可以从收到的所有请求中访问,并充当所有线程的队列?我是否应该将执行程序声明为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本身会用它来管理它的线程。是否也可以将这些线程添加到此执行程序中?
答案 0 :(得分:0)
通常在应用服务器中进行显式线程管理是个坏主意。您可以将servlet设置为在新线程中运行,从而避免将内容转移到servlet中的另一个线程。我还没有查看Tomcat是否允许您配置允许的servlet的最大并发实例数,因此这可能仍然是一个问题。
如果您明确使用了' Thread.sleep()',请不要放弃“InterruptedException”'像那样。这是错误的做法。查找正确的东西(处理和重新中断)。