2

我正在使用 Glassfish 3 Web 配置文件,无法让 http 工作人员在 servlet 上同时执行请求。

这就是我观察到问题的方式。我制作了一个非常简单的 servlet,它将当前线程名称写入标准输出并休眠 10 秒:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    System.out.println(Thread.currentThread().getName());
    try {
        Thread.sleep(10000); // 10 sec
    }
    catch (InterruptedException ex) {
    }
}

当我同时运行多个请求时,我在日志中清楚地看到请求是按顺序执行的(每 10 秒跟踪一次)。

INFO: http-thread-pool-8080-(2)
(10 seconds later...)
INFO: http-thread-pool-8080-(1)
(10 seconds later...)
INFO: http-thread-pool-8080-(2)

等等

我所有的 GF 设置都保持不变——这是开箱即用的配置(默认线程池最少 2 个线程,如果我没记错的话,最多 5 个线程)。

我真的不明白为什么 sleep() 会阻塞所有其他工作线程。任何见解将不胜感激!

4

2 回答 2

2

克里斯在他的评论中明确了这一点。我复制了您的 servlet,对其进行了如下测试:

package com.stackoverflow.q2755338;

import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {

    public static void main(String... args) throws Exception {
        // Those are indeed called sequentially.
        System.out.println("Starting to fire 3 requests in current thread...");
        new TestURL().run();
        new TestURL().run();
        new TestURL().run();
        System.out.println("Finished firing 3 requests in current thread!");

        // But those are called three at once.
        System.out.println("Starting to fire 3 requests in each its own thread...");
        ExecutorService executor = Executors.newFixedThreadPool(3);
        executor.submit(new TestURL());
        executor.submit(new TestURL());
        executor.submit(new TestURL());
        System.out.println("Finished firing 3 requests in each its own thread!");
        executor.shutdown();
    }

}

class TestURL implements Runnable {

    @Override
    public void run() {
        try {
            System.out.println("Firing request...");
            new URL("http://localhost:8181/JavaEE6/test").openStream();
            System.out.println("Request finished!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

服务器端的结果是:

信息:开始:http-thread-pool-8181-(2)
(10 秒)
信息:结束:http-thread-pool-8181-(2)
信息:开始:http-thread-pool-8181-(1)
(10 秒)
信息:结束:http-thread-pool-8181-(1)
信息:开始:http-thread-pool-8181-(2)
(10 秒)
信息:结束:http-thread-pool-8181-(2)

信息:开始:http-thread-pool-8181-(1)
信息:开始:http-thread-pool-8181-(2)
信息:开始:http-thread-pool-8181-(3)
(10 秒)
信息:结束:http-thread-pool-8181-(1)
信息:结束:http-thread-pool-8181-(2)
信息:结束:http-thread-pool-8181-(3)
于 2010-05-02T23:28:11.973 回答
1

你有在单线程模式下运行的 servlet 吗?
这将在您的 web.xml 中

于 2010-05-02T23:31:01.760 回答