【发布时间】:2013-02-03 19:28:51
【问题描述】:
在 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,例如映射到 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东西(上) - servlet/监听器
我想我想知道如何实现代码,以便每次收到新请求时,例如FizzServlet#doGet,如何确保将请求发送到可用线程(如果有可用线程)。这样,如果 FizzServlet 是我公开的唯一 servlet,它可能会被调用多达 10 次,然后才会导致新的(第 11 个)传入请求在前一个请求正在处理时挂起。
我正在寻找 servlet 和这个线程创建代码之间的粘合代码。提前致谢。
【问题讨论】:
-
我不太明白有什么困惑。基本上,您从 ThreadManager 获得 ThreadFactory,然后使用 Runnable 启动一个新线程。你还需要知道什么?
-
@jtahlborn - 使用 Threads 以及 Factory 和 Manager 类,很难判断哪些 servlet 将为哪些线程提供服务。
-
再一次,我并没有真正关注。 每个请求 可以生成的线程数量有限(并且这些线程必须在请求返回之前结束)。据我所知,servlet 与它无关(具体),而且 servlet 不提供线程...
-
啊,是的,但是 servlet 线程有一个工厂,每个工厂都必须以某种方式(在后台)连接到 GAE 前端或后端实例。我认为这就是问题所在。
-
...我的问题中的问题! (?!?!)
标签: java multithreading google-app-engine