voici le problème et ma modélisation:
le programme est un proxy mais juste le coté serveur suffit pour illustrer le probleme.
En fait au lieu de simplement lancer un Thread pour chaque nouvelle connexion entrante, je passe par un InputConnectionManager qui contient un Vector avec tous les Threads (InputConnection).
j'utilise donc dans le serveur une methode de se Manager qui me retourne le Thread que je lance donc ensuite.
Lors de la fermeture du server (Ctrl-C), je veux fermer proprement toutes les connexions. j'ai donc mis un ShutdownHook dans le serveur.
Dans ce close, je force la fin de tout mes Threads (input connexion) un par un et j'attends leur fin (join).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { close(); } });
Tout ça marche très bien à un détail près: mes Threads restent bloqués sur des read (socket). C'est le fonctionnement normal: le client est censé m'envoyer une commande ou bien fermer la socket mais je fais mes tests en telnet et cela est un peu soppo. De plus tant qu'un seul des clients ne m'a pas envoyé quelque chose, le serveur n'est pas fermé puisqu'il reste sur le join. Il n'y a pas un moyen de break les read bloquant afin de forcer la fermeture ?
(les threads sont une boucle infinie: réception commande/ envoi réponse qui ne se break que lorsque la cmd est QUIT, c'est pour ça que je me retrouve avec un read bloquant)
Merci d'avance pour l'aide
PS: je viens de penser à un truc: est ce possible d'utiliser des signaux en java ? le serveur pourrait propager le Ctrl-C à tous les Threads. ça devrait killer les reads et avec un ShutdownHook je pourrai être propre. je verrai ça se soir, là je dois bouger.
Partager