IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Quartz timeout thread pool


Sujet :

Java

  1. #1
    Membre régulier Avatar de kodo
    Profil pro
    Chef de projet technique
    Inscrit en
    Mars 2006
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations professionnelles :
    Activité : Chef de projet technique

    Informations forums :
    Inscription : Mars 2006
    Messages : 300
    Points : 92
    Points
    92
    Par défaut Quartz timeout thread pool
    bonjour,
    j'utilise l'api quartz pour ordonnancement de taches. En effet l'utilisateurs de mon application, chargent des fichiers que je dois traiter par un job quartz.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
    org.quartz.threadPool.threadCount =10
    org.quartz.threadPool.threadPriority = 5
    org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
    Je souhaite mettre un timeout pour interrompre et libérer les threads qui dépassent un certain temps d'exécution.
    J'ai fiat des recherches, mais je n'ai pas trouvé comment faire avec quartz, aussi j'ai essayé d'utiliser l'api concurrency avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    private static void testTimeout() throws Exception {
    		ExecutorService executor = Executors.newCachedThreadPool();
    	     Callable<Object> task = new Callable<Object>() {
                public Object call() throws InterruptedException, MalformedURLException, Exception {
                	return compte(2000000000); 
                }
            };
            Future<Object> future = executor.submit(task);
            try {
            	System.out.println("Avant appel : "+ new Date());
                Object result = future.get(100, TimeUnit.MILLISECONDS);
                System.out.println("Apres appel : "+ new Date());
     
            }catch (TimeoutException te){
            	future.cancel(true);
            	executor.shutdownNow();
            	throw new Exception("TimeoutException : cette action a pris plus que le temps permi");
            }catch(ExecutionException ee){
            	future.cancel(true);
            	executor.shutdownNow();
            	throw new Exception("ExecutionException : Une erreur d'execution s'est produite");
            }catch(InterruptedException ie){
            	future.cancel(true);
            	executor.shutdownNow();
            	throw new Exception("InterruptedException : Une erreur a servenu");
            }
    	}
    Une exception est bien levée après expiration de 100ms, mais le traitement continue.
    Avez vous une idée comment implémenter un timeout ?

    Merci.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    on ne peut pas arrêter un thread, comme ça, sans savoir ce qu'il était en train de faire à ce moment-là. Ou alors, seulement en arrêtant le programme Java dans son entier.

    Plus exactement on peut, c'est ce que fait Thread.stop(), mais dans ce cas on s'expose au fait que ce thread était en train de faire des choses qui, si arrêtées en plein milieu, deviennent un état invalide de la mémoire ou autres joyeusetés imprévisibles et irrécupérables. Donc, techniquement on peut, mais il ne faut pas le faire et c'est pour cela qu'aucun moyen simple de le faire est fourni : parce qu'il ne faut pas vouloir le faire.

    Un thread doit prendre lui-même la responsabilité de vérifier régulièrement s'il n'y a pas une volonté de l'interrompre, et si oui, s'arrêter là.

    On peut imaginer plusieurs mécanismes pour cela, mais Java standardise Thread.interrupt() / Thread.interrupted(). Notamment le cancel(true) va appeler Thread.interrupt(). Le thread doit donc vérifier régulièrement si personne ne cherche à l'interrompre.

    A noter que la plupart des APIs bloquantes fournies par Java, vérifient elles-mêmes si leur thread n'est pas interrompu, ou ne devient pas interrompu lors d'une attente bloquée. Mais, si on fait un traitement longuet bien que non-bloquant ou n'utilisant pas les APIs fournies par Java et ne prenant pas soin de vérifier si elles sont interrompues, alors ça ne marche pas tout seul bien sûr. Exemple, une simple boucle infinie. Ou un calcul bien trop long pour être réaliste.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. simple Thread pool
    Par relbeghdadi dans le forum Général Java
    Réponses: 2
    Dernier message: 04/01/2011, 18h17
  2. Serveur : Thread Pool et IOPC
    Par Jerede dans le forum C#
    Réponses: 1
    Dernier message: 06/09/2010, 09h01
  3. [JBoss] Thread Pool par application
    Par Jibee dans le forum Wildfly/JBoss
    Réponses: 0
    Dernier message: 23/12/2008, 09h16
  4. Timeout sur pool de threads
    Par ploxien dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 17/08/2007, 15h24
  5. [Thread]Pool de threads
    Par rlnd23 dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 14/02/2006, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo