在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
我想我对如何连接这两个想法感到窒息。据我所知,你有三种不同的机制/项目:
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启动实例时运行自定义代码;和ServletContextListener
/ ThreadFactory
内容(上图)我想我想知道如何实现代码,以便每次有新请求进入时,例如ThreadManager
,如何确保将请求发送到可用线程(如果有可用的话) 。这样,如果FizzServlet#doGet
是我公开的唯一一个servlet,它可能被调用最多10次,然后它会导致新的(第11个)传入请求在前一个请求处理时挂起。
我正在寻找servlet和这个创建线程的代码之间的粘合代码。提前谢谢。
答案 0 :(得分:2)
我想我想知道如何实现代码,以便每次有新请求进入时,比如FizzServlet#doGet,如何确保将请求发送到可用线程(如果有可用的话)。这样,如果FizzServlet是我公开的唯一一个servlet,它可能被调用最多10次,然后它会导致新的(第11个)传入请求在前一个请求处理时挂起。
这就是GAE servlet引擎为您所做的。部署包含servlet的应用程序,当请求进入时,servlet引擎使用线程处理请求并调用servlet。你没有任何事可做。
如果由GAE调用的servlet的doGet()
或doPost()
方法需要并行执行多个任务(例如联系其他几个网站),那么您将自己启动线程在你链接到的页面中解释。