首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >弹簧并发并行请求

弹簧并发并行请求
EN

Stack Overflow用户
提问于 2016-06-02 09:28:36
回答 1查看 2.3K关注 0票数 1

我使用Spring开发系统,然后我发现我的应用程序一次只处理一个请求。我的应用程序部署在linux上的tomcat服务器上。

为了确认这一点,我创建了一个简单的页面,首先启动时间,然后睡眠10秒,然后得到结束时间,然后将它们显示在视图中。然后在浏览器中同时访问该页面3次。下面的结果确认服务器一次只处理一个请求。

起点:清华6月02 17:01:24 CST 2016完:清华06月17:01:34科技委2016年TimeLapsed : 10001

起点:清华6月02 17:01:34科技委2016年末:清华06月17:01:44科技委2016年TimeLapsed : 10001

起点:清华6月02 17:01:44科技委2016年末:清华06月17:01:54科技委2016年TimeLapsed : 10001

我的控制器代码:

代码语言:javascript
运行
复制
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Date;
@Controller
@RequestMapping("/")
public class ParallelTestController {
    @RequestMapping(value="/test", method = RequestMethod.GET)
    public String test(ModelMap model) {
        String startTimeStr = new Date().toString();
        long startTime = System.currentTimeMillis();
        try{
            Thread.sleep(10000);
        }catch(Exception e){
        }
        String endTimeStr = new Date().toString();
        long endTime   = System.currentTimeMillis();
        long totalTime = endTime - startTime;
        model.addAttribute("startTime", startTimeStr);
        model.addAttribute("endTime", endTimeStr);
        model.addAttribute("totalTime", totalTime);
        return "welcome";
    }
}

我的视图代码:

代码语言:javascript
运行
复制
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"     "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>HelloWorld page</title>
</head>
<body>
    Greeting : ${greeting}
    <br />
    Start : ${startTime}
    <br />
    End : ${endTime}
    <br />
    TimeLapsed : ${totalTime}
    <br />
</body>
</html>

web.xml

代码语言:javascript
运行
复制
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
                http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>EMS</display-name>
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
 </servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

如何将我的应用程序配置为同时处理多个请求?或者是tomcat配置?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-03 07:01:39

您的应用程序正在按预期工作,使用不同的线程处理请求,因此应用了并行处理:

代码语言:javascript
运行
复制
Thread : http-bio-8080-exec-23 Start : Thu Jun 02 17:49:51 CST 2016 End : Thu Jun 02 17:50:01 CST 2016 TimeLapsed : 10001 
Thread : http-bio-8080-exec-24 Start : Thu Jun 02 17:50:03 CST 2016 End : Thu Jun 02 17:50:13 CST 2016 TimeLapsed : 10000 
Thread : http-bio-8080-exec-28 Start : Thu Jun 02 17:50:13 CST 2016 End : Thu Jun 02 17:50:23 CST 2016 TimeLapsed : 10000 

那么,为什么这些请求是串行执行的呢?您所看到的是与浏览器相关的内容,也就是说,您正在从同一个浏览器启动请求,并且在上一个请求完成之前,它不会执行下一个请求。这就是为什么当您尝试使用两种不同的浏览器时,您会看到您所期望的:

代码语言:javascript
运行
复制
browser 1: Thread : http-bio-8080-exec-31 Start : Fri Jun 03 08:38:13 CST 2016 End : Fri Jun 03 08:38:23 CST 2016 TimeLapsed : 10000 – rbmeo 6 hours ago        
browser 2: Thread : http-bio-8080-exec-29 Start : Fri Jun 03 08:38:11 CST 2016 End : Fri Jun 03 08:38:21 CST 2016 TimeLapsed : 10000

那么,前端控制器进程每个会话请求一个?来自同一浏览器的请求具有相同的cookieid,所以相同的会话对吗?

不,不是每次都有一个请求。如果进行两个AJAX调用,您将看到它们属于同一个HttpSession,并且它们是并行处理的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37587826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档