Bonsoir

J'ai un programme java qui effectue sue 30 serveurs different la commande "ls" grace à l'API JSCH. Afin d'accelerer ces traitements j'ai ajouté du Threading avec du "callable"
Je constate que lorsque je lance le War depuis mon tomcat7 sous Windows7, cela met 3 secondes pour tous les serveurs alors que sur la machine Linux en kernel 2.6.32 cela met 30*3 secondes
Les threads ne sont pas parallelisé,chaque commande attend la fin du précedent pour se lancer ?
Pourquoi une difference alors que c'est le meme programme ?
C'est du Java7/Tomcat7

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
 
    public String sendCommandWithouthSecurityCheck(String hostname,String command,boolean forceExit) throws MyDomainException{
        publicKeyValidThrowException();        
 
        Session session = null;
        ChannelExec channel=null;        
        try(ByteArrayOutputStream outputStreamErr = new ByteArrayOutputStream()) {
            session = jsch.getSession(USER_MM, hostname);
            session.setConfig("StrictHostKeyChecking", "no");  
            session.setConfig("PreferredAuthentications","publickey,keyboard-interactive,password");//Permet de ne pas bloquer a l'attente du mot de passe de la session
            session.connect(); //NoTimeout
 
            channel= (ChannelExec)session.openChannel("exec");            
 
            channel.setInputStream(null);
            channel.setErrStream(outputStreamErr);
 
            channel.setCommand(command);
 
            channel.connect();
 
            String resultOut,resultErr;
            try (InputStream is = channel.getInputStream()) {
                resultOut = toString(is);
            }
 
            if(outputStreamErr.size()==0){
                resultErr = null;
            }else{
                resultErr = outputStreamErr.toString();
            }            
 
            //il faut deconnecter le channel avant de recuperer le retour code
            channel.disconnect();
            session.disconnect();
 
            int nbRetry = 0;
            while(!channel.isClosed() && !forceExit){
                if(nbRetry>=NB_RETRY_CLOSE){
                    throw new MyDomainRollbackException("Impossible de fermer la connexion SSH de la '" + command + "' sur l'hote " + hostname+" apres "+NB_RETRY_CLOSE+" tentatives");
                }
                nbRetry++;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    log.error("Timeout connexion SSH de la '" + command + "' sur l'hote " + hostname);
                    forceExit=true;
                }
            }
 
            if(nbRetry!=0){
                log.warn("Fermeture de la connexion SSH de la '" + command + "' sur l'hote " + hostname + "  apres " + nbRetry+" tentatives");
            }
 
            int exitStatus = channel.getExitStatus();
 
            if (exitStatus == 0) {
                log.info("Command '" + command + "' execute sur l'hote " + hostname + " : '" + resultOut+"'");
                return resultOut;
            } else { 
                if(exitStatus == -1){
                    log.error("Le canal SSH n'a pas ete correctement ferme avant la recuperation du retour code de la commande '" + command + "' sur l'hote " + hostname + " (test canal ferme via API : " + channel.isClosed() +", nombre de retry : "+nbRetry+", force exit : "+forceExit+")");
                }
                if (resultErr == null) {
                    throw new MyCommandException("Une erreur est survenue lors de l'execution de la commande '" + command + "' sur l'hote " + hostname + " (exit code " + exitStatus + ")",exitStatus,resultErr);
                } else {
                    throw new MyCommandException("Une erreur est survenue lors de l'execution de la commande '" + command + "' sur l'hote " + hostname + " : '" + resultErr + "' (exit code " + exitStatus + ")",exitStatus,resultErr);
                }
            }
        } catch (JSchException | IOException ex) {
            throw new MyDomainRollbackException(ex);
        } finally {
            if (channel != null && !channel.isClosed()) {
                channel.disconnect();
            }
            if (session != null && session.isConnected()) {
                session.disconnect();
            }
        }
    }
 
 
-------------
Je n'ai pas tout mis
        ExecutorService      executor = Executors.newFixedThreadPool(NTHREDS);
        List<Future<String>> list     = new ArrayList<Future<String>>();
 
        for (int cpt = 0; cpt < max; cpt++) {
            Callable<String> worker = new MyCallableB(cpt, show, s);
            Future<String>   submit = executor.submit(worker);
 
            list.add(submit);
        }
 
    for (Future<String> future : list) {
 
                   try {
                rt = future.get();
 
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }