【问题标题】:Invoking asynchronous method from servlet从 servlet 调用异步方法
【发布时间】:2013-08-28 13:43:47
【问题描述】:

上下文:

我做了很多阅读,但只发现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,还是我也需要实现它?

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


【问题讨论】:

  • 所以你的问题是你的tomcat在给定时间处理的最大请求是多少,以及如何调整这个数字?
  • @rocketboy 更像是“如何加快处理大量请求的速度?” SotiriosDelimanolis,我改了,谢谢。

标签: java multithreading tomcat servlets asynchronous


【解决方案1】:

问题一:

Servlet 容器保留一个用于处理请求的线程池。它还保留您的 servlet 类的单个实例。当一个请求进来时,它会分派这些线程之一,最终命中相应的doXXX 方法。线程并没有真正排队。它们并行工作。所以同时进来的请求被并行处理(在一定程度上,请阅读here

问题 2:

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

Read this for information about how to manage Threads.

【讨论】:

  • 谢谢你的回答,真的教会了我很多!所以我的理解是:1)所有并发线程都会同时调用getID方法。 2)默认情况下,MyClass 中的任何方法都是异步调用的(?) 3)我需要使我的 Servlet 异步,以便为额外的请求释放线程。我是否正确理解了所有内容? Tomcat 容器是否提供最高效的线程处理,或者我可以做些什么来改善第 n 个用户的处理时间?
  • 1) 他们在类的不同实例上调用相同的方法,所以除非他们被某些东西阻塞(在类级别同步?),你不必担心。 2)取决于你所说的异步是什么意思。在当前线程的上下文中执行是同步的。 3) 不一定。您可以随时增加池线程的数量,具体取决于您的需要。在我看来,您正在尝试进行过早的优化。不。编写代码并进行测试。
  • 在(2)中我担心线程干扰,但看起来你在(1)中回答了它,谢谢!我已经编写了所有代码,现在我担心当数以万计的请求开始进入时会发生什么(而且它们会)。我的实际代码太长且太具体,无法用作我的问题的示例。我希望这个问题适用于那些将来会偶然发现它的人。
  • 有成千上万的并发请求(!!!)这样的需求,考虑集群。
  • 您是否有机会将我链接到您的信息来源,上面写着“他们正在调用相同的方法,但在类的不同实例上”?我在任何地方都找不到它,想了解更多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
相关资源
最近更新 更多