F5和CTRL + F5在并发请求处理中导致不同的行为

时间:2016-02-29 17:57:22

标签: servlets concurrency httprequest refresh

前提1 :此问题被标记为this one的副本,其中接受的(仅)答案或多或少是浏览器对多个请求使用相同的HTTP连接,而servlet容器每个连接使用一个线程。这是答案的一半,我试图理解为什么刷新和硬刷新有不同的行为。显然,这不是一个严格的Java问题,但仍然属于编程领域:不是重复,不是OT,imho。无需关闭它,一个有趣的讨论可以从这里开始。

前提2 :我理解使用 F5 CTRL + F5 刷新浏览器页面之间的区别,但无论如何,这对我没有帮助。

我有这个servlet

public class MyServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    List<String> items = new ArrayList<>();

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        System.out.print(request.getSession().getId()+" accessing list");

        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        items.add(""+LocalTime.now().getSecond());

        System.out.println(items);

    }

    //irrelevant code
}

我第一次从浏览器中调用它并等待(稍微多于)4秒钟以获取响应并将我的JSESSIONID与我的浏览器相关联:

18:39:59,823 INFO  [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:40:03,823 INFO  [...] [3]

现在,我在同一个浏览器中打开三个选项卡,将servlet url粘贴到每个选项卡中,然后依次按Enter键,可能需要两秒钟。这是我得到的输出

18:41:33,534 INFO  [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:41:37,534 INFO  [...] [3, 37]
18:41:37,542 INFO  [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:41:41,543 INFO  [...] [3, 37, 41]
18:41:41,549 INFO  [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:41:45,549 INFO  [...] [3, 37, 41, 45]

看起来每个请求都是按顺序处理的:对于每个要处理的请求,您必须等待前一个请求被终止。

但如果我回到三个标签并快速 CTRL + F5 ,我会得到我期待的行为:

18:46:37,812 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:46:38,838 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:46:39,571 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:46:41,815 [...] [3, 37, 41, 45, 41]
18:46:42,838 [...] [3, 37, 41, 45, 41, 42]
18:46:43,571 [...] [3, 37, 41, 45, 41, 42, 43]

每个请求都是并行运行的。 最后一次测试,如果我只是 F5 ,我会回到意想不到的顺序行为

18:50:10,581 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:14,582 [...] [3, 37, 41, 45, 41, 42, 43, 14]
18:50:14,590 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:18,591 [...] [3, 37, 41, 45, 41, 42, 43, 14, 18]
18:50:18,597 [...] 5MYxcir_Pz5isCLmWtchZRCx accessing list
18:50:22,597 [...] [3, 37, 41, 45, 41, 42, 43, 14, 18, 22]

有谁能帮我理解幕后发生的事情?为什么我的请求有时会按顺序处理?

我在Windows,WildFly 8.x AS,Chrome或Firefox(相同的行为)下。

注意:

我使用[...]来缩短输出,但它表明每个请求都由不同的线程处理(确切地说是不同的Thread.currentThread().getName()值)。这意味着我没有“每个连接一个线程”,我变得更加困惑......

0 个答案:

没有答案