java - 用于处理并发用户的多线程 GAE servlet

标签 java multithreading google-app-engine servlets

我想对我的 GAE servlet 进行多线程处理,以便同一个实例上的同一个 servlet 可以处理多达 10 个(在前端实例上,我相信最大线程数是 10)来自不同的并发请求用户在同一时间,他们每个人之间的时间片。

public class MyServlet implements HttpServlet {
    private Executor executor;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        if(executor == null) {
            ThreadFactory threadFactory = ThreadManager.currentRequestFactory();
            executor = Executors.newCachedThreadPoolthreadFactory);
        }

        MyResult result = executor.submit(new MyTask(request));

        writeResponseAndReturn(response, result);
    }
}

基本上,当 GAE 启动时,第一次收到对此 servlet 的请求时,会创建一个 Executor,然后将其保存。然后每个新的 servlet 请求都使用该执行程序来生成一个新线程。显然 MyTask 中的所有内容都必须是线程安全的。

我关心的是这是否真的达到了我希望的效果。也就是说,这段代码是否创建了一个可以同时处理来自多个用户的多个请求的非阻塞 servlet?如果不是,为什么以及我需要做什么来修复它?而且,一般来说,还有什么 GAE 大师可以发现完全错误的地方吗?提前致谢。

最佳答案

我认为您的代码行不通。

doGet 方法在 servlet 容器管理的线程中运行。当一个请求进来时,一个servlet线程被占用,直到doGet方法返回才会释放。在您的代码中,executor.submit 将返回一个 Future 对象。要获得实际结果,您需要在 Future 对象上调用 get 方法,它将阻塞直到 MyTask 完成其任务。只有在那之后,doGet 方法才会返回,新的请求才能启动。

我对GAE不熟悉,但是根据their docs ,您可以将您的 servlet 声明为线程安全的,然后容器将向每个 Web 服务器并行分派(dispatch)多个请求:

<!-- in appengine-web.xml -->
<threadsafe>true</threadsafe>

关于java - 用于处理并发用户的多线程 GAE servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864476/

相关文章:

python - Tweepy Google App Engine 计费错误

google-app-engine - 使用 Go 中的模块在 App Engine 上保持与 APNs 的连接打开

c++ - Eigen3 矩阵乘法性能取决于处理器?

google-app-engine - Sockets API 被拒绝了吗?

java - 在二维阵列网格上绘制圆圈(JAVA)

java - 点击后在Android应用程序中传递部分链接

java - 线程操作和线程销毁的最佳实践?

c++ - Boost Thread 的 boost::unique_lock 是作用域锁吗?

java - 如何使用 Java 线程从 MySQL 检索数据?

java - 用于比较巨大方板(1000 x 1000)中坐标的数据结构