多线程& Google App Engine Servlets

时间:2013-02-03 19:28:51

标签: java multithreading google-app-engine

在Google App Engine(GAE)上,前端实例可以创建多达10个线程以最大化吞吐量。根据{{​​3}},这种多线程可以完成如下:

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,例如映射到FizzServlet的{​​{1}}:

http://myapp.com/fizz

我想我对如何连接这两个想法感到窒息。据我所知,你有三种不同的机制/项目:

  1. App Engine实例本身,我可以通过实现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. } } 来“挂钩”生命周期,并在GAE启动实例时运行自定义代码;和
  2. ServletContextListener / ThreadFactory内容(上图)
  3. servlets / listeners
  4. 我想我想知道如何实现代码,以便每次有新请求进入时,例如ThreadManager,如何确保将请求发送到可用线程(如果有可用的话) 。这样,如果FizzServlet#doGet是我公开的唯一一个servlet,它可能被调用最多10次,然后它会导致新的(第11个)传入请求在前一个请求处理时挂起。

    我正在寻找servlet和这个创建线程的代码之间的粘合代码。提前谢谢。

1 个答案:

答案 0 :(得分:2)

  

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

这就是GAE servlet引擎为您所做的。部署包含servlet的应用程序,当请求进入时,servlet引擎使用线程处理请求并调用servlet。你没有任何事可做。

如果由GAE调用的servlet的doGet()doPost()方法需要并行执行多个任务(例如联系其他几个网站),那么您将自己启动线程在你链接到的页面中解释。