在 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 种不同的机制/项目:
ServletContextListener
App Engine 实例本身,我可以通过在 GAE 启动实例时实现并运行自定义代码来“挂钩”其生命周期;和- 这个
ThreadFactory
/ThreadManager
东西(上) - 小服务程序/侦听器
我想我想知道如何实现代码,以便每次收到新请求时,例如FizzServlet#doGet
,如何确保将请求发送到可用线程(如果有可用线程)。这样,如果FizzServlet
是我公开的唯一 servlet,它可能会被调用多达 10 次,然后才会导致新的(第 11 个)传入请求在前一个请求正在处理时挂起。
我正在寻找 servlet 和这个线程创建代码之间的粘合代码。提前致谢。