3

在 Google App Engine (GAE) 上,前端实例可以创建多达 10 个线程以最大化吞吐量。根据this page,这样的多线程可以实现如下:

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映射到http://myapp.com/fizz

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. ServletContextListenerApp Engine 实例本身,我可以通过在 GAE 启动实例时实现并运行自定义代码来“挂钩”其生命周期;和
  2. 这个ThreadFactory/ThreadManager东西(上)
  3. 小服务程序/侦听器

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

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

4

1 回答 1

2

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

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

如果 GAE 调用的 servletdoGet()doPost()方法需要并行执行多个任务(例如联系其他几个网站),那么您将按照链接到的页面中的说明自行启动线程。

于 2013-02-03T19:58:45.380 回答