0

如果您将线程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调用对象负责实际处理 HTTP 请求。在 EJB 领域,这将是“业务逻辑”代码,它执行以下操作:(1) 将消息放入队列,(2) 访问 Google Datastore 获取数据,(3) 将内容保存到缓存等。也就是说,当它的call()方法由Executor.

我是否必须使从内部创建的每个对象都是MyTask#call线程安全的?为什么或者为什么不?提前致谢!

4

1 回答 1

2

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

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

于 2013-02-08T18:58:08.950 回答