在Google App Engine(GAE)上,前端实例最多可以创建10个线程以最大化吞吐量。根据此页面的说明,可以通过以下方式实现多线程:
为了访问我的GAE服务器端,我将公开许多映射到特定URL的Servlet,例如映射到
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/fizz
的FizzServlet
: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种不同的机制 / 项目:
- App Engine实例本身,我可以通过实现
ServletContextListener
来“挂钩”其生命周期,并在GAE启动实例时运行自定义代码; 和 - 这个
ThreadFactory
/ThreadManager
东西(上面) - Servlets / listeners
我想知道如何实现代码,以便每次新请求进入,例如FizzServlet#doGet
,如何确保该请求被发送到可用线程(如果有一个可用)。 这样,如果FizzServlet
是我唯一公开的servlet,则它可以被调用多达10次,然后才会在正在处理以前的请求时使新的(第11个)传入请求挂起。
我正在寻找将Servlet与此创建线程的代码粘合在一起的方法。 预先感谢。