Problème ping + lancement (ou arret) programme (fini]

mais en cas de panne réseau ou autre, les logiciels java différents comment le relancer?

eux ils ne detecte rien comme panne, et si on les relance pas, ils restent complètement coincés

c est pour cela que je voulais executer les programmes “externes” en question et arreter ceux qui étaient devenus coincés et je n ai pas le hcoix de le faire.

Sinon le détecteur fonctionnera bien, mais le reste sera complètement HS…

Tu as mis un time-out de 2 s sur le “isReachable”, je n’ai pas Java5, je ne peux pas tester, mais au pire, s’il ne marche pas, tu peux tuer le Thread. Essaie déjà comme ça, et si ça ne marche pas, je modifie un peu ton code pout tuer les Thread récalcitrants.

tu veux dire que je lancerais les autres programmes par un thread du “controleur”?

et par la meme occasion unifier les programmes…

comment appeler le main d’un autre programme?


et je rajouterais meme, comment tuer un thread ?

Dans le classpath: bien ajouter tes autres programmes à lancer.

 Thread thread = 
(new Thread(){
  public void run(){
     fr.clubic.deltree.UnProgramme.main(new String[]{"arg0","arg1"});
  }
}).start();


thread.interrupt();// : arrête le Thread (piège: il faut qu'il rende bien la main sur les catch de InterruptedException)

Edité le 09/08/2007 à 14:14

je te remercie.

j ai modifié mais c est pas encore ca, je me suis planté quelque part

mon premier fichier :
Analyserreseau.java


import java.util.ArrayList;
import java.util.Date;

 
public class AnalyserReseau {
		
	public static void main(String[] args) {
 
		int i;
		for(i=0;i< 50000000 ;i++)
		{
		//Liste de tous les machines/sites a tester
		ArrayList<ThreadPing> maListe = new ArrayList<ThreadPing>();
		maListe.add(new ThreadPing("192.168.120.251"));	//sera OK	

		
		//debut des Ping sachant qu'il y a des sites ou ça va foirer !!!
		Date dateDebut = new Date();


			for( ThreadPing tp : maListe)
				{
				tp.start() ;
				Thread thread =  (new Thread(){public void run(){ticket.TicketController.main(new String[]{"arg0","arg1"});}}).start(); 
				}
				
			try
				{
				for( ThreadPing tp : maListe)
					{
					tp.join() ;
					}
				}
				catch(InterruptedException ie)
					{
					ie.printStackTrace();
					}
			Date dateFin = new Date();
			//fin ping
			long diff = dateFin.getTime() - dateDebut.getTime();
			System.out.println("Tps execution => "+diff);
			
			try 
				{
				Thread.sleep(5000);
				} 
				catch (InterruptedException e) 
				{
				// TODO Auto-generated catch block
				e.printStackTrace();
				} 
			}
		
	}
 
}
 
 

et ici le Treadping.java:


import java.io.IOException;
import java.net.InetAddress;
import java.util.Properties;


 
public class ThreadPing extends Thread 
{
	private String nom  ;
	private boolean pingOK = false ;
	private final int tpsTimeOut = 2000;
	
	public ThreadPing( String nomMachineATester )
	{
		this.nom = nomMachineATester ;
	}
	
	public void run()
	{
		try{
			InetAddress i = InetAddress.getByName(nom);
			pingOK = i.isReachable(this.tpsTimeOut);
			if(pingOK)
				{
				System.out.println(this.nom +" => OK");
				}
			else
			{
				System.out.println(this.nom +" => ECHEC !!!");
				Thread.sleep(5000);
		        Properties sys = System.getProperties();
		        String os = sys.getProperty("os.name");
		        Runtime r = Runtime.getRuntime();
		        if (os.endsWith("2000"))
		        	{
		        	thread.interrupt();
		        	}
			        else
			        	r.exec("taskkill javaw");
			}
			}
		catch(Exception e)
		{
			e.printStackTrace();}

		
	}
	
	public boolean isPingOk()
	{
		return this.pingOK ;
	}
}
 
 

Donc peu de moficiation par rapport aux codes précédents

Malgré tout:
dans le 1er fichier:
Thread thread = (new Thread(){public void run(){ticket.TicketController.main(new String[]{“arg0”,“arg1”});}}).start();
Eclipse n’aime pas du tout
“Multiple markers at this line
- Type mismatch: cannot convert from void to Thread
- overrides java.lang.Thread.run”

Tout comme dans le 2eme:
thread.interrupt();
“Multiple markers at this line
- thread cannot be resolved
- Line breakpoint:ThreadPing [line: 36] - run()”

qu en pensez vous?
Pour l’instant je n’ai fait que le lancement du nouveau thread et la fermeture du thread du main parrallèle.
Edité le 09/08/2007 à 16:00


import java.util.ArrayList;
import java.util.Date;

 
public class AnalyserReseau {
    public static void main(String[] args) {
        new AnalyserReseau().analyser();
  }
 
     protected Thread thread;
     public Thread getThread(){return thread;}

      public void analyser(){
		for(;;)
		{
		//Liste de tous les machines/sites a tester
		ArrayList<ThreadPing> maListe = new ArrayList<ThreadPing>();
		maListe.add(new ThreadPing("192.168.120.251", thread ));	//sera OK	

		
		//debut des Ping sachant qu'il y a des sites ou ça va foirer !!!
		Date dateDebut = new Date();
		thread =  (new Thread(){public void run(){ticket.TicketController.main(new String[]{"arg0","arg1"});}}); 


			for( ThreadPing tp : maListe)
				{
				tp.start() ;
				
                                 //modif
                                thread.start();
				}
				
			try
				{
				for( ThreadPing tp : maListe)
					{
					tp.join() ;
					}
				}
				catch(InterruptedException ie)
					{
					ie.printStackTrace();
                                         //modif
                                         return,
					}
			Date dateFin = new Date();
			//fin ping
			long diff = dateFin.getTime() - dateDebut.getTime();
			System.out.println("Tps execution => "+diff);
			
			try 
				{
				Thread.sleep(5000);
				} 
				catch (InterruptedException e) 
				{
				e.printStackTrace();
                                //modif
                                return;
				} 
			}
		
	}
 
}
 
 

et ici le Treadping.java:


import java.io.IOException;
import java.net.InetAddress;
import java.util.Properties;


 
public class ThreadPing extends Thread 
{
	private String nom  ;
	private boolean pingOK = false ;
	private final int tpsTimeOut = 2000;
       private Thread otherThread;
	
	public ThreadPing( String nomMachineATester , Thread anotherThread)
	{
		this.nom = nomMachineATester ;
this.otherThread = anotherThread;
	}
	
	public void run()
	{
		try{
			InetAddress i = InetAddress.getByName(nom);
			pingOK = i.isReachable(this.tpsTimeOut);
			if(pingOK)
				{
				System.out.println(this.nom +" => OK");
				}
			else
			{
				System.out.println(this.nom +" => ECHEC !!!");
//modif
/*
				Thread.sleep(5000);
		        Properties sys = System.getProperties();
		        String os = sys.getProperty("os.name");
		        Runtime r = Runtime.getRuntime();
		        if (os.endsWith("2000"))
		        	{
		        	thread.interrupt();
		        	}
			        else
			        	r.exec("taskkill javaw");
*/
otherThread.interrupt();
			}
			}
		catch(Exception e)
		{
			e.printStackTrace();}

		
	}
	
	public boolean isPingOk()
	{
		return this.pingOK ;
	}
}
 
 

Thread thread = (new Thread(){public void run(){ticket.TicketController.main(new String[]{“arg0”,“arg1”});}}).start();
je me suis emballé à tout mettre dans la mpeme ligne: mauvaise habitude (corrigé dans le source)

  • thread cannot be resolved
    à cause des erreurs du dessus.
    Edité le 09/08/2007 à 17:20

donc effectivement pas de soucis, ca lance tout

j’ai été obligé (suite au fait que je me suis aussi emballé) j avais pas positionne correctement la place du lancement de main exterieur…résultat il était dans la boucle for ce qui allait pas.

Je l ai mis or de la boucle et maintenant pas de soucis.

J’ai une petite question:
Pourquoi tu as mis en commentaire la partie arret du thread en cas de problème?

je l’avais pas vu, mais il y a un pbm d’algorithmie là dessus: tu ne peux pas le mettre à cet endroi car tu a une seule instance du Thread “TicketController” pour potentiellement plusieurs de “ThreadPing”

et la variable “thread” n’est pas accessible dans ThreadPing car elle est local à la méthode “main” il faut que tu la passe en paramètre au ThreadPing si tu veux qu’elle soit accessible.

ou la la ca devient compliqué…

y a t il moyen de numéroter les threads?
Ensuite un envoi en paramètre d’un INT dans ThreadPing puis on arrete CE thread correspondant a ce numéro?

es ce possible?

Tout est possible, mais ça dépend de ce que tu fait exactement:
tu ping plusieurs machine, quel est le lien avec l’application “TicketController” qu’il faut arrêter: est-ce que tu as un TicketController par ip pingée?? si oui=> pas besoin de tableau, tu associe directement l’application lancée à l’ip controllée.
si non=> tu ne devrais avoir qu’une seul “TicketController” ou alors?

quoiqu’il en soit, si tu veut dans tes Thread travailler sur les mêmes variables, il faut les passer aux Threads, et ne pas travailler (jamais d’ailleurs) en static => je vais modifier mon code en conséquence.

En réalite je m explique:

il y a 2 parties ou le controleur doit intervenir

une partie plus serveur ou il y a la version Ticket.Controller serveur. La il aura en charge de pinger une adresse et le ticket.controller devra perpetuellement et en temps reel recuperer les infos venant de cette adresse (la meme).

SI il y a plusieurs équipements distant a recuperer les adresses, je priviligerais de lancer plusieurs application en parallèle mais complètement indépendante ou leur seul point commum serait la base de données ou elles mettraient les informations recues. Donc chaque application aura au maximum 1 seul ticket.controller a gerer

De plus a cela, s’ajoute une partie client, ou la le controleur devra vérifier 2 adresses, l’une étant la meme adresse que celle surveillée par le controleur serveur, et l’autre étant le serveur lui-meme. Sur le meme principe le ticket.controller (mais une partie “cliente”) recupère des infos du serveur (donc l’une des deux adresses pingée)

Il y a une dernière contrainte, le serveur doit pouvoir dans certains cas pouvoir gérer 2 programmes java en parallèle en gros sur le serveur dans la configuration indiquée precedement aura de lancé:
le controler (analyserreseau), ticket.controller (serveur)…et port qui est une programme qui duplique le port de reception (infos venant de l’adresse pingée) en plusieurs ports d’émission pour les postes clients.


je precise que ticket.controller et port sont tous les 2 a redemarrer en cas de soucis

De plus le programme port, n’intervient pas sur les postes clients.
Edité le 09/08/2007 à 17:46

:hello:
Hier j’était mal réveillé, alors ce matin j’ai relu ton post 3 fois, et j’ai rien compris :pt1cable:
bref, je ne voudrais pas trop rentrer dans les détails du fonctionnement, juste reste sur la technique: come j’ai modifé mon source, est-ce que la façon dont le tue le Thread te convient?

:slight_smile:

je te remercie vraiment pour ton aide.
ca a l air de marcher nickel!!

tu penses qu on peut lancer deux main dans le thread? (ticket.ticketcontrolleur et Forwarder )


j ai essaye. Mais j ai une erreur "Unhandled exception type IOException" sur le forwarder.

Je t’en prie :ajp:

on peut, c’est ton main qui lève une exception, peut-être les arguments?

j ai fait au plus simple c est a dire:

	 Thread thread = (new Thread(){public void run() {ticket.TicketController.main(new String[]{"arg0","arg1"});Forwarder.main(new String[]{"arg0","arg1"});}});

hum c est de toute facon faux: au mieux ca sera: Thread thread = (new Thread(){public void run() {ticket.TicketController.main(new String[]{"arg0","arg1"});Forwarder.main("192.168.120.251", 2050, 2051);}}); //modif mais le 2ème main n'aime pas: The method main(String[]) in the type Forwarder is not applicable for the arguments (String, int, int)

mais en tout cas tu as raison dans le main du forwarder j ai ca et a coup sur ca vient de la:
public Forwarder(String remoteHost, int remotePort, int localPort) throws IOException

a ma connaissance on peut remplacer le IOException par un try/catch?

Oui, et il te faut un Thread par appli si tu veux qu’elles tournent en parallèle:
try{ …} catch (Exception ){} pour catcher els exceptions, eclipse doit te le proposer.

		 Thread thread1 = (new Thread(){public void run() {ticket.TicketController.main(new String[]{"arg0","arg1"});}});   
		 Thread thread2 = (new Thread(){
		    public void run() {
                       try{
                       Forwarder.main(new String[]{"192.168.120.251", "2050", "2051"});
		      }catch (IOException e){ e.printStackTrace(System.err);}
		  }});  

Edité le 10/08/2007 à 12:41

avec


		 Thread thread2 = (new Thread(){  public void run() {  
		 try{  Forwarder.main(new String[]{"192.168.120.251", "2050", "2051"}); }
		 catch (IOException e){ e.printStackTrace(System.err);}  }}); 
		 thread2.start();

rien ne se passe, Forwarder n’est meme pas lancé via Eclipse. Pourtant aucune erreur…bizarre

d’un autre coté:
le main de Forwarder est déclarer avec des arguments qui sont string et int.
(actuellement c est lancé ainsi: new Forwarder(“192.168.120.251”, 2050, 2051).start(); )

mais ca peut pas venir de ca puisqu il ne se lance meme pas et Eclipse n’indique rien comme étant ca le problème

Si ton Forwarder est déjà un Thread, pas besoin de le lancer dans un autre Thread:


		 Thread thread2 = new Forwarder("192.168.120.251", 2050, 2051);
		 thread2.start();
// ou alors
Thread thread2 = (new Thread(){  public void run() {  
		 try{  new Forwarder("192.168.120.251", 2050, 2051).start();  }
		 catch (IOException e){ e.printStackTrace(System.err);}  }}); 

Edité le 10/08/2007 à 13:46

si on doit le lancer dans un autre thread je crain.

Le problème avec ce Forwader c est qu il attent les connexions…résultat il bloque le reste du programme d’après ce que je vois

le “ou alors” correspond au lancement dans un autre Thread (on crée le Thread, contenant lui même la ligne de commande puis on le lance) :wink: