Spring并发并行请求

时间:2016-06-02 09:28:37

标签: spring multithreading spring-mvc concurrency parallel-processing

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

为了确认这一点,我创建了一个简单的页面,首先获取starttime然后休眠十秒然后获取结束时间,然后在视图中显示它们。然后我在浏览器中同时访问此页面3次。下面的结果确认服务器一次只处理一个请求。

开始:2016年6月2日星期四17:01:24 CST 结束:Thu Jun 02 17:01:34 CST 2016 TimeLapsed:10001

开始:2016年6月2日星期四17:01:34 CST 2016 结束:Thu Jun 02 17:01:44 CST 2016 TimeLapsed:10001

开始:2016年6月2日星期四17:01:44 CST 结束:Thu Jun 02 17:01:54 CST 2016 TimeLapsed:10001

我的控制器代码:

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";
    }
}

我的观看代码:

<%@ 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

<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配置?

1 个答案:

答案 0 :(得分:1)

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

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 

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

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并且它们是并行处理的。