多线程和谷歌应用引擎Servlets

3
在Google App Engine(GAE)上,前端实例最多可以创建10个线程以最大化吞吐量。根据此页面的说明,可以通过以下方式实现多线程:
Runnable myTask = new Runnable({
    @Override
    public void run() {
        // Do whatever
    }
});

ThreadFactory threadFactory = ThreadManager.currentRequestThreadFactory();

// GAE caps frontend instances to 10 worker threads per instance.
threadFactory.newRequestThread(myTask);

为了访问我的GAE服务器端,我将公开许多映射到特定URL的Servlet,例如映射到http://myapp.com/fizzFizzServlet:
public class FizzServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        // Handle the request here. Somehow send it to an available
        // worker thread.
    }
}
我猜我正在为如何连接这两个想法而苦恼。 就我所看到的,您有3种不同的机制 / 项目:

  1. App Engine实例本身,我可以通过实现ServletContextListener来“挂钩”其生命周期,并在GAE启动实例时运行自定义代码; 和
  2. 这个ThreadFactory / ThreadManager东西(上面)
  3. Servlets / listeners

我想知道如何实现代码,以便每次新请求进入,例如FizzServlet#doGet,如何确保该请求被发送到可用线程(如果有一个可用)。 这样,如果FizzServlet是我唯一公开的servlet,则它可以被调用多达10次,然后才会在正在处理以前的请求时使新的(第11个)传入请求挂起。

我正在寻找将Servlet与此创建线程的代码粘合在一起的方法。 预先感谢。


我不太明白混淆在哪里。基本上,你从ThreadManager获取ThreadFactory,然后使用你的Runnable启动一个新的线程。你还需要知道什么? - jtahlborn
使用线程以及Factory和Manager类,很难确定哪些servlet将为哪些线程提供服务。 - user1768830
再说一遍,我真的不太明白。每个请求都有一个有限数量的线程可以生成(这些线程必须在请求返回之前结束)。就我所知,Servlet 没有什么(特定的)关系,而且 Servlet 并不提供线程服务... - jtahlborn
我的问题出在哪里!(?!?) - user1768830
是的,这正是@JBNizet所解释的,现在我明白了。在我将某个答案标记为“最终答案”之前,我喜欢等待至少一两天,但很可能会给他“绿色勾选”。 - user1768830
显示剩余2条评论
1个回答

2
我想知道如何实现这样的代码,每当有一个新请求进入,比如FizzServlet#doGet,如何确保该请求被发送到可用线程(如果有可用线程)。这样,如果FizzServlet是我唯一公开的servlet,在处理前一个请求时,它可以被调用多达10次,而不会导致新的(第11个)传入请求挂起。
这就是GAE servlet引擎为您完成的工作。您部署包含servlet的应用程序,当请求进入时,servlet引擎使用线程处理请求并调用您的servlet。您无需做任何操作。
如果GAE调用的servlet的doGet()或doPost()方法需要同时执行多个任务(例如联系其他几个网站),则需要像您链接的页面中所解释的那样自己启动线程。

感谢 @JB Nizet (+1) - 那么我能否总是指望我的servlet可以生成多达10个线程,或者“GAE线程”可能会占用这个数字?再次感谢。 - user1768830
文档显示每个请求限制50个并发请求线程。因此,理论上,如果只有50个并发线程,并且所有线程在请求之前完成,则可以启动数百个线程。但是,API文档还指出,如果线程创建时间过长,可能会抛出运行时异常。我不知道比文档所说的更多了。 - JB Nizet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接