我使用运行servlet的Tomcat开发了一个简单的服务器。
该Servlet调用命令行程序-执行该程序大约需要20秒钟,然后通过JSON将结果返回给用户。问题是-如果我同时提出了2个以上的请求,则servlet会阻塞直到之前的请求之一完成为止。
可以在下面看到一个示例-“Im in”是servlet的顶部,结果列表是在servlet执行之后。所有请求都是同时发出的-但您可以清楚地看到它们并没有同时处理。为了同时处理所有请求,我需要在tomcat中更改什么设置?
算我一个
算我一个
FVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLE
FVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLE
算我一个
FVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLE
算我一个
FVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLE
算我一个
FVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLE
算我一个
FVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLE
算我一个
FVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLE
算我一个
FVFNT01 STOP_IDLE FVFNT03 STOP_IDLE FVFNT16 STOP_IDLE FVFNT17 STOP_IDLE
最佳答案
默认情况下,对Servlet的请求是并发处理的。没有设置可以启用/禁用此行为。这由JavaDoc for HttpServlet确认:
但是,如果您的Servlet实现标记接口(interface)SingleThreadModel,则该Servlet一次只能处理一个请求。但是,使用此接口(interface)通常被认为是一种不好的做法,并且由于您没有提到它,因此我认为您没有使用它。
当然,即使您没有实现SingleThreadModel
,您也可以使用(可能不合适的)同步使任何servlet单线程运行,例如
class MyServlet extends HttpServlet {
private void Object sharedObject = new Object()
protected synchronized void doGet(HttpServletRequest req, HttpServletResponse resp) {
// method logic goes here
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
synchronized(sharedObject) {
// method logic goes here
}
}
protected void doPut(HttpServletRequest req, HttpServletResponse resp) {
synchronized(this) {
// method logic goes here
}
}
}
在上面的示例中,尽管(例如)一个线程可以执行
doPost()
,而另一个线程执行doGet()
,则一次只能有一个线程执行相同的请求方法。如果您不明白为什么会这样,那么我建议您在进一步研究问题之前阅读一下Java并发编程的内容。