0

Im развивающаяся система, использующая Spring MVC FrameWork, тогда я обнаружил, что мое приложение обрабатывает запрос по одному за раз. Мое приложение было развернуто на сервере tomcat на linux.Параллельный запрос Spring Concurrency

Чтобы подтвердить это, я создал простую страницу, которая сначала запускает старт, а затем спает в течение десяти секунд, а затем заканчивает время, а затем отображает их на виду. Затем я просматриваю эту страницу в браузере 3 раза одновременно. Результат ниже подтверждает, что сервер обрабатывает только запрос по одному.

Начало: чт 2 июня 17:01:24 CST 2016 Конец: чт 2 июня 17:01:34 CST 2016 TimeLapsed: 10001

Начало: чт 2 июня 17:01:34 CST 2016 Конец: чт 2 июня 17:01:44 CST 2016 TimeLapsed: 10001

Начало: чт 2 июня 17:01:44 CST 2016 Конец: чт 2 июня 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 config?

+0

Давайте посмотрим на темы. add, перед 'String startTimeStr = new Date(). toString();', эта строка: 'System.out.println (Thread.currentThread(). getName());' и размещать журнал для каждого запроса. – codependent

+0

Тема: http-bio-8080-exec-23 Начало: Чт июн 02 17:49:51 CST 2016 Конец: Чт июн 02 17:50:01 CST 2016 TimeLapsed: 10001 \t \t Тема: http-bio-8080 -exec-24 Начало: Чт Июн 02 17:50:03 CST 2016 Конец: Чт июн 02 17:50:13 CST 2016 Время Задержка: 10000 \t \t Тема: http-bio-8080-exec-28 Начало: Чт июня 02 17:50:13 CST 2016 Конец: Чт июн 02 17:50:23 CST 2016 TimeLapsed: 10000 – akoayisangmahusaynaprogrammer

+0

Запросы обрабатываются не тем же потоком, а тремя разными: http-bio-8080-exec-23 , http-bio-8080-exec-24 и http-bio-8080-exec-28, поэтому проблем не должно быть. – codependent

ответ

0

Ваше приложение работает так, как и ожидалось, обработки запросов с разными потоками, поэтому параллельная обработка применяется:

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 

поэтому процесс FrontController просит один за один сеанс? запросы от у того же браузера есть тот же файл cookieid, поэтому тот же сеанс справа?

Нет, это не один запрос за сеанс. Если вы сделаете два вызова AJAX, вы увидите, что они принадлежат к одному и тому же HttpSession, и они обрабатываются параллельно.

Смежные вопросы