从servlet调用异步方法

时间:2013-08-28 13:43:48

标签: java multithreading tomcat servlets asynchronous

上下文:

我做过很多阅读,但只发现this半相关。

我有一个servlet,它从另一个Java类调用一个方法,同时传递会话敏感数据。它在Tomcat服务器上运行。

它看起来像这样:

@WebServlet(urlPatterns = {"/MyServlet", "/"})
public class MyServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{ 
        HttpSession session = request.getSession(true); //Start a session
        String UserID = session.getId();                //Get a unique user ID
        MyClass cls = new MyClass();                    //Initialize my class
        String shortID = cls.newID(UserID);         //Call a method from class
        System.out.println("Your short ID is: " + shortID); //Print the result
    }
}

并说我打电话的课程看起来像这样:

public class MyClass {

    public String newID(String UserID){
        String shortID;
            ... //Method for shortening the UserID
            return(shortID);
    }
}

当然,这种方法需要的处理能力远远超过这个简单的例子。

问题1:

现在,我目前的理解是,当 n 用户同时调用 MyServlet 时,Tomcat会在 doGet n 个线程>方法。因此,当同步调用方法 newID 时,Tomcat会对线程进行排队,并允许它们一个接一个地执行。这是对的吗?

问题2:

当我有大量用户时会出现问题,因为 n 用户必须等待 newID 方法完成 n-1 次,可能需要一段时间。因此,我想异步调用 newID 方法,以便并行运行 n 线程,从而提高吞吐量。

我怎样才能做到这一点?

您是否建议使用反射,或将 newID 方法包装在 Runnable 中?

Tomcat是否负责 ExecutorService ,还是需要实现它?

任何帮助将不胜感激。示例代码也很有用!


1 个答案:

答案 0 :(得分:1)

问题1:

Servlet容器保留了一个用于处理请求的线程池。它还保留了servlet类的单个实例。当请求进入时,它会调度其中一个最终命中相应doXXX方法的线程。线程并没有真正排队。他们并行工作。因此,同时处理的请求将被并行处理(在某种程度上,请阅读here

问题2:

假设您已将servlet容器配置为具有10个线程池来处理请求。但在某些时候你会得到15个请求。然后是的,5个请求将排队等待可用的线程。在这种情况下,您可以使用Servlet 3.0异步支持(read1read2)在单独的线程(容器也管理)中处理请求。处理完成后,将重新分派池线程以完成请求处理。

Read this for information about how to manage Threads.