我使用运行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并发编程的内容。

10-07 16:20
查看更多