ALOM

🛠️ Handcrafting everything

Threads, Sockets & Servlets đź’™

UBER

Un micro-service c'est :

  • Un ou plusieurs canaux de communication
    • HTTP - REST/JSON
    • HTTP - REST/XML
    • JMS / Messaging
    • Kafka / Avro
  • Un ensemble de fonctionnalitĂ©s du mĂŞme domaine mĂ©tier
  • Une source de donnĂ©es dĂ©diĂ©e

Zoom sur un micro-service

Zoom sur un micro-service Java

On s'appuie sur les technologies connues: les servlets !

## Comment fonctionne une servlet ? * Utilise des Sockets pour les communication réseau * Utilise des Threads pour exécuter chaque Socket indépendamment * Parse les requêtes HTTP (du texte) pour en faire des objets Java
## Threads
### Le système d'exploitation ![](threads/Operating_system_placement.svg.png)
### Une application mono-threadée ![](threads/app-mono-thread.png)
### Une application multi-threadée ![](threads/app-multi-thread.png)
### Les Threads en Java ```java public void run() { System.out.println("I am Thread A"); } ``` ```java public void run() { System.out.println("I am Thread B"); } ```
### Les threads sont indépendants et ordonnancés ![](threads/app-threads-ordonnanceur.png) ```text > I am Thread A > I am Thread B ``` ```text > I am Thread B > I am Thread A ```
### Création d'un thread * Deux possibilités pour créer une classe exécutée par un thread : * Création d’une classe implémentant l’interface Runnable * Création d’une classe héritant de la classe abstraite Thread * Dans les deux cas, il faut implémenter la méthode `public void run()`
### Instanciation et démarrage * Pour instancier une classe implémentant Runnable : * `Thread t = new Thread(new MaClasse());` * Pour instancier une classe héritant de la classe Thread : * `Thread t = new MaClasse();` * Pour démarrer le Thread t lorsqu’il a été instancié : * `t.start();`
### Cycle de vie d'un thread * Lorsqu’un thread démarre, c’est la méthode `run()` qui est exécutée * Le thread est « vivant » (alive) aussi longtemps qu’il n’a pas terminé d’exécuter la méthode `run()` * La seule manière « propre et naturelle » de terminer un thread est de faire en sorte que le thread termine l’exécution de la méthode `run()`
### Cycle de vie d'un thread * Interdiction d’utiliser les méthodes suivantes pour arrêter un thread (deprecated) : * `stop()` * `suspend()` * A utiliser pour arrêter un thread: * `interrupt()`: Peut causer des `InterruptedException` si le thread était en attente (`Thread.sleep`, ou `Object.wait()`)
### DĂ©velopper des threads *infinis* ```java public void run(){ while(true) { // Non ! // Impossible Ă  arrĂŞter proprement ! } } ```
### DĂ©velopper des threads *infinis* ```java [|2|5|8-10] public class FinishableThread extends Thread { private boolean running = false; public void run(){ this.running = true; while(this.running) { } } public void finish(){ this.running = false; } } ```
## Sockets et connexions
### Communications Ip ![](sockets/communication-ip.png)
### Sockets côté client Pour créer une connexion vers un serveur, il faut : * Créer une socket côté client * Renseigner l’adresse IP du serveur * Renseigner le port d’écoute du serveur Exemple : ```java Socket s = new Socket("5.6.7.8",12345); // s.getInputStream() to read data // s.getOuputStream() to send data ```

L'Ă©tablissement d'une connexion

### Sockets côté serveur Pour accepter des connexions côté serveur, il faut : * Créer une socket serveur côté serveur * Renseigner le port d’écoute souhaité * Lancer l’écoute Exemple : ```java ServerSocket ss = new ServerSocket(12345); Socket s = ss.accept(); // s.getInputStream() to read data // s.getOuputStream() to send data ```

Sockets & Threads

Exécuter une boucle de `accept()` dans un Thread, et les associer un Thread à chaque `Socket` acceptée

Servlets

Principes

Morceau de serveur
  • Traite des requĂŞtes HTTP associĂ©es Ă  une URL
  • ExĂ©cutĂ©e par le conteneur de servlets (ex. Tomcat)

Et si on jouait?

TP Threads et Sockets

TP Servlets

Fin du cours