0

Im entwickelnden System mit Spring MVC FrameWork dann habe ich festgestellt, dass meine App Anfragen einzeln bearbeitet. Meine App wurde in Tomcat Server unter Linux bereitgestellt.Spring Concurrency parallel Anfrage

Um dies zu bestätigen, habe ich eine einfache Seite erstellt, die zuerst die Startzeit erhält, dann für zehn Sekunden ruht, dann die Endzeit erhält und sie dann in der Ansicht anzeigt. Dann greife ich auf diese Seite in meinem Browser 3 mal gleichzeitig zu. Das folgende Ergebnis bestätigt, dass der Server die Anfrage nur einzeln verarbeitet.

Start: Do 2. Juni 17.01.24 CST 2016 Ende: Do 2. Juni 17.01.34 CST 2016 Timelapsed: 10001

Start: Do 2. Juni 17.01.34 CST 2016 Ende: Do 2. Juni 17.01.44 CST 2016 Timelapsed: 10001

Start: Do 2. Juni 17.01.44 CST 2016 Ende: Do 2. Juni 17.01.54 CST 2016 Timelapsed: 10001

Mein Controller-Code:

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

Meine Ansicht Code:

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

Wie kann ich konfigurieren meine app mehrere Anforderungen gleichzeitig zu behandeln? Oder ist Tomcat-Konfiguration?

+0

Lassen Sie uns die Threads sehen. füge vor 'String startTimeStr = new Date(). toString();' folgende Zeile hinzu: 'System.out.println (Thread.currentThread(). getName());' und poste das Protokoll für jede Anfrage. – codependent

+0

Thread: http-bio-8080-exec-23 Start: Do Jun 02 17:49:51 CST 2016 Ende: Do Jun 02 17:50:01 CST 2016 TimeLapsed: 10001 \t \t Thema: http-Bio-8080 -exec-24 Start: Do Jun 02 17:50:03 CST 2016 Ende: Do Jun 02 17:50:13 CST 2016 TimeLapsed: 10000 \t \t Thema: http-bio-8080-exec-28 Start: Do Jun 02 17:50:13 CST 2016 Ende: Do Jun 02 17:50:23 CST 2016 TimeLapsed: 10000 – akoayisangmahusaynaprogrammer

+0

Die Anfragen werden nicht vom selben Thread bearbeitet, sondern von 3 verschiedenen: http-bio-8080-exec-23 , http-bio-8080-exec-24 und http-bio-8080-exec-28, es sollte also kein Problem geben. – codependent

Antwort

0

Ihre Anwendung wird als erwartet, Verarbeitungsanforderungen mit unterschiedlichen Threads arbeiten, so Parallelverarbeitung angewendet wird:

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 

Warum dann die Anfragen seriell ausgeführt werden? Was Sie sehen, ist Browser-bezogen, das heißt, Sie starten Anfragen von demselben Browser und es führt die nächste Anfrage nicht aus, bis die vorherige fertig ist. Deshalb, wenn Sie mit zwei verschiedenen Browsern versuchen Sie sehen, was Sie erwarten:

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 

so der Frontcontroller Prozess fordert eine pro Sitzung? Anfragen von gleichen Browser haben die gleiche Cookie-ID, also die gleiche Sitzung richtig?

Nein, es ist nicht eine Anfrage pro Sitzung. Wenn Sie zwei AJAX-Aufrufe durchführen, sehen Sie, dass sie zu derselben HttpSession gehören und parallel verarbeitet werden.