Servfish请求在Glassfish v3中无顺序执行

时间:2010-05-02 22:55:04

标签: java servlets multithreading java-ee glassfish-3

我正在使用Glassfish 3 Web配置文件,无法让http worker在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()会阻止所有其他工作线程。任何见解将不胜感激!

2 个答案:

答案 0 :(得分: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();
        }
    }

}

服务器端的结果是:

INFO: start: http-thread-pool-8181-(2)
(10 seconds)
INFO: end: http-thread-pool-8181-(2)
INFO: start: http-thread-pool-8181-(1)
(10 seconds)
INFO: end: http-thread-pool-8181-(1)
INFO: start: http-thread-pool-8181-(2)
(10 seconds)
INFO: end: http-thread-pool-8181-(2)

INFO: start: http-thread-pool-8181-(1)
INFO: start: http-thread-pool-8181-(2)
INFO: start: http-thread-pool-8181-(3)
(10 seconds)
INFO: end: http-thread-pool-8181-(1)
INFO: end: http-thread-pool-8181-(2)
INFO: end: http-thread-pool-8181-(3)

答案 1 :(得分:1)

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