多线程GAE应用程序需要同步



Google应用程序引擎允许您在将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应用程序引擎线程如何利用MyTask对象下的对象树有一些与并发相关的担忧。

MyTask可调用程序负责实际处理HTTP请求。在EJB领域,这将是"业务逻辑"代码,它可以执行以下操作:(1)将消息放置在队列中,(2)访问Google数据存储区以获取数据,(3)将数据保存到缓存中,等等。关键是,当Executor执行其call()方法时,它会生成一个大的"对象树"(许多后续的子对象)。

我必须确保从MyTask#call线程内部创建的每个对象都是安全的吗?为什么提前感谢!

您不需要所有这些就可以使一个实例同时处理多个请求。如果在处理单个给定请求时需要并行执行多个任务,GAE允许您生成线程。

例如,如果您需要同时联系几个外部URL以获取响应给定请求所需的信息,那么它可能会很有用。这将比按顺序联系所有URL更有效。

最新更新