Tomcat thread par request

Fermé
XI - 27 janv. 2018 à 22:33
 XI - 27 janv. 2018 à 23:12
Bonjour tout le monde,

Je débute avec les appli web en Java et j'ai une question concernant la façon dont Tomcat gère les request qui arrivent.

J'ai un projet simple avec une Servlet dont voici la partie de code qui m'intéresse :

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

// Set response content type
response.setContentType("text/html");

// Actual logic goes here.
PrintWriter out = response.getWriter();
out.println("<h3>" + Thread.currentThread().getName() + "</h3>");
out.println("<h3>" + this + "</h3>");
out.println("<h3> start at " + java.time.LocalDateTime.now() + "</h3>");
try {
Thread.sleep(1000 * 10);
} catch (Exception e) {}
out.println("<h3> end at " + java.time.LocalDateTime.now() + "</h3>");

}

L'idée est simple, je fais un appel, le Thread sleep pendant 10 secondes et termine.
D'après ce que j'ai pu lire Tomcat créé un Thread par requête, or avec mon exemple ça ne fonctionne pas tout à fait comme je m'y attendais. Puisque j'affiche l'heure de début/fin du Thread je peux voir que si je fais deux appels consécutifs le deuxième appels attend que le premier soit terminé avant de se lancer. Par on voit aussi que le nom du Thread courant est bien différent.


// appel 1
http-nio-8080-exec-2
A@35f7139e
start at 2018-01-27T22:32:07.949
end at 2018-01-27T22:32:17.949



// appel 2
http-nio-8080-exec-3
A@35f7139e
start at 2018-01-27T22:32:17.958
end at 2018-01-27T22:32:27.958


Je suis donc un peu perdu.
Une âme charitable peut-elle m'expliquer ce qu'il se passe ?

Merci.

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
27 janv. 2018 à 22:56
Bonjour,

Ce comportement est surprenant, est ce que tu pourrais nous donner ta version de Tomcat et de Java pour tester dans les mêmes conditions que toi ?

De plus, si tu as un fichier web.xml ou des annotations sur ta classe merci de fournir le code correspondant.
0
Hello KX,

alors,
java : java version "1.8.0_161"
tomcat : apache-tomcat-9.0.4

class Java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// Extend HttpServlet class
public class A extends HttpServlet {

private String message;

public void init() throws ServletException {
// Do required initialization
message = "Hello World";
}

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

// Set response content type
response.setContentType("text/html");

// Actual logic goes here.
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
out.println("<h2>" + message + "</h2>");
out.println("<h3>" + Thread.currentThread().getName() + "</h3>");
out.println("<h3>" + this + "</h3>");
out.println("<h3> start at " + java.time.LocalDateTime.now() + "</h3>");
try {
Thread.sleep(1000 * 10);
} catch (Exception e) {}
out.println("<h3> end at " + java.time.LocalDateTime.now() + "</h3>");

}

public void destroy() {
// do nothing.
}
}


web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 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"
version="2.4">

<display-name>Hello, World Application</display-name>
<description>
This is a simple web application with a source code organization
based on the recommendations of the Application Developer's Guide.
</description>

<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>A</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

</web-app>
0