gpt4 book ai didi

java - 从 servlet 调用异步方法

转载 作者:行者123 更新时间:2023-11-28 22:21:09 26 4
gpt4 key购买 nike

上下文:

我读了很多书,但只找到了this半相关。

我有一个从另一个 Java 类调用方法的 servlet,同时传递 session 敏感数据。它运行在 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,还是我也需要实现它?

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


最佳答案

问题一:

Servlet 容器保留一个用于处理请求的线程池。它还保留您的 servlet 类的单个实例。当收到请求时,它会分派(dispatch)其中一个线程,该线程最终会触发相应的 doXXX 方法。线程并没有真正排队。它们并行工作。所以同时进入的请求被并行处理(在某种程度上,阅读 here

问题二:

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

Read this for information about how to manage Threads.

关于java - 从 servlet 调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18489708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com