Google App Engine允许您创建线程,如果您将ThreadManager.currentRequestThreadFactory()
与ExecutorService
结合使用。因此,为了允许同一个前端实例同时处理多个servlet请求,我计划编写如下所示的代码:
public class MyServlet implements HttpServlet {
private RequestDispatcher dispatcher;
// Getter and setter for 'dispatcher'.
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
MyResponse resp = dispatcher.dispatch(request);
PrintWriter writer = response.getWriter();
// Use the 'resp' and 'writer' objects to produce the resultant HTML
// to send back to the client. Omitted for brevity.
}
}
public class RequestDispatcher {
private ThreadFactory threadFactory =
ThreadManager.currentRequestThreadFactory();
private Executor executor;
// Getters and setters for both properties.
public MyResponse dispatch(HttpServletRequest request) {
if(executor == null)
executor = Executors.newCachedThreadPool(threadFactory);
// MyTask implements Callable<MyResponse>.
MyTask task = TaskFactory.newTask(request);
MyResponse myResponse = executor.submit(task);
}
}
所以现在我相信我们有一个设置,每个前端都有一个servlet,可以同时接受多达10个(我相信这是GAE允许的最大值)请求,并且进程所有这些都同时没有阻塞。首先,如果我错误地使用ThreadManager
并且没有正确使用它,或者我对此类并发行为的设置不正确,请先纠正我!
假设我或多或少走上正轨,我对Google App Engine线程如何利用MyTask
对象下的对象树有一些与并发相关的问题。
MyTask
callable负责实际处理HTTP请求。在EJB领域,这将是“业务逻辑”代码,它可以执行以下操作:(1)将消息放入队列,(2)访问Google数据存储区以获取数据,(3)将内容保存到缓存等。是的,当call()
执行Executor
方法时,它会生成一个大的“对象树”(许多后续的子对象)。
我是否必须使从MyTask#call
内部创建的每个对象都是线程安全的?为什么或为什么不呢?提前致谢!
答案 0 :(得分:2)
您不需要所有这些来使实例能够同时处理多个请求。如果您在处理单个请求时需要并行执行多个任务,则GAE允许您生成线程。
例如,如果您需要并行联系多个外部URL以获取响应给定请求所需的信息,那么它可能很有用。这样可以更有效地按顺序联系所有URL。