Application Monitoring de Databases

Résolu
ouranos21 Messages postés 9 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 14 janvier 2008 - 14 déc. 2007 à 10:57
ouranos21 Messages postés 9 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 14 janvier 2008 - 10 janv. 2008 à 09:48
Bonjour à tous,


J'aimerais réaliser une application de monitoring en java (évidemment).


Pour le moment, mon application "tourne". Elle initialise une connexion
en base de données, affiche à l'écran le résultat de la requête
envoyée, en boucle, et grâce à l'utilisation d'un thread. Jusque là
rien de bien méchant.


(Je développe sous windows.)


Seulement voilà, cette application devrait tourner sur un server à base
UNIX, et en "tâche de fond". Le concept est que l'application ne
devrait jamais s'arrêter, mais qu'elle puisse recevoir des commandes
(du style unix, nom_d_appli param1 param 2 etc...) et ne renvoyer un
résultat à l'écran que quand on le lui demande.


Une commande pourrait par exemple être:

javac Listing /reload pour relancer l'application (recharger le fichier
de configuration par la même occasion si on fait une modification
dedans)

ou encore

javac Listing /status pour affiche le résultat d'une seule réponse de la requête qui tourne en boucle.


Et je n'ai aucune idée de la manière dont je dois m'y prendre ni de ce
que je dois utiliser. Pourriez-vous m'aiguiller s'il vous plaît ?

Je n'ai pas de grande expérience en programmation client/server/réseau
(Ni même programmation tout court mais bon, disons que je suis novice
et que je m'attaque à un gros morceau).

Dernière chose, l'application tournera en mode console.


Je pense avoir pigé que je devrais utiliser des threads multiples, mais
je suis pas sûr du tout. La cryptographie vient se mêler à tout ça,
mais ça je me débrouillerai ^^


D'avance merci.

Bonne journée/soirée.

Ouranos21.

Merci aux développeurs !
Et désolé si je n'ai pas posté dans la bonne section.

8 réponses

ouranos21 Messages postés 9 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 14 janvier 2008
10 janv. 2008 à 09:48
Mouais...

En fait suffisait que côté client, je spécifie que mon envoie de donnée était bien fini: rajouter un "\n" à la fin de la chaîne envoyée côté client.
3
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
14 déc. 2007 à 13:02
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<title>
</title>
<meta name="GENERATOR" content="OpenOffice.org 2.3 (Linux)" />
<style type="text/css">
<!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
-->
</style>
Salut,

c'est quoi comme OS sur
ton UNIX ? je demande ça car la création d'un démon(
ou service si tu préfère) n'est pas la même en
fonction de l'OS....(attention si tu fais un démon il sera
exécuté en root...)

ensuite pour reload un démon
(à la main ou via une appli qui as les droits
root)
prompt_root# /etc/init.d/monService restart

sinon tu
fais un petit socket dans ton application (le démon) qui si il
reçoit un certain message il recharge la config...





------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
ouranos21 Messages postés 9 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 14 janvier 2008
14 déc. 2007 à 13:29
Merci pour ta réponse.

Niveau OS c'est Sun Solaris.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
14 déc. 2007 à 14:07
Salut,

oki dans ce cas regarde du coté de la commande 'start-stop-daemon'

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ouranos21 Messages postés 9 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 14 janvier 2008
18 déc. 2007 à 15:22
Voilà j'en sait un peu plus sur le machin.

Déjà la plate forme n'est plus Sun Solaris, c'est Linux mais je ne connais pas la distribution (ça n'a pas d'importance je pense)     

Je sais que je dois utiliser des sockets. L'appli va tourner côté serveur en boucle, indéfiniment, et de temps en temps, en temps voulu en fait, l'application cliente va intérroger l'application serveur en  afin de par exemple connaître le noms des Databases du schèma monitoré. L'application serveur va tourner sur deux serveurs simultanément, ainsi que l'application cliente. Seulement si un des serveurs à un soucis, l'autre doit s'en rendre compte et, dés lors, faire des choses. Je pense comprendre que je dois implèmenter du multithread mais je suis toujours aussi paumé.

Mon problème: je ne trouve pas de bon exemple pour comprendre les  sockets, dans une applications qui s'apparente à ce que je dois faire (histoire que l'exemple serve sinon... pour ça j'ai déjà cherché et :-( ). Vous n'auriez par hasard pas des pistes ou des choses comme ça ? Quelques sources simples qui traînent sur ce sujet ? Des conseils ?

D'avance merci.

Merci aux développeurs !
0
ouranos21 Messages postés 9 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 14 janvier 2008
20 déc. 2007 à 11:42
J'avance petit à petit dans mon truc, mais je crois de mon souci viens de mon application cliente.

A quoi devrait ressembler une application cliente qui, par exemple lorsqu'on la démarre et qu'on écrit "status" (en ligne d ecommandes) nous renvoie le résultat à l'écran d'une requête SQL qui s'effectue côté serveur ? (bête requête du genre "SELECT noms FROM ma_table;"

Ou alors à la limite juste une application cliente qui, lorsqu'on la démarre, affiche tout bêtement le résultat d'une requête SQL qui tourne côté Serveur. En gros je sais que côté serveur mon appli tourne bien. Là avec mes socket, mon application serveur démarre et attend une qu'un client s'y connecte, lorsque le client est connecté, la requête sur la DB se lance, ça fonctionne côté serveur j'en suis sure, mais j'arrive pas à afficher le résultat de cette requête côté client... :(.

Comme ça je pourrais comparer avec ce que je fais et voir si mon problème vient de ce que je fais du côté application serveur, ou du côté client. Mais je pense quand même que ça vient du côté client.

Merci.
0
ouranos21 Messages postés 9 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 14 janvier 2008
20 déc. 2007 à 15:55
Allez je partage quand même mon code supposé foireux. La méthode select() exécute ma requête SQL et est censée afficher le résultat de la requête.

public void select(String request)
    {
        int cpt=0;
        String db_name=" ";
        //request 
        try 
        {
            Statement stm = con.createStatement();
            rs = stm.executeQuery(request);
            BufferedReader entreeClavier = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
              DataOutputStream sortieVersClient = new DataOutputStream(connexion.getOutputStream());
              //PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);
            while (rs.next()) //fetching the resultset
            {
                    db_name=rs.getString(1);
                    sortieVersClient.writeBytes(db_name+ " ");
                    //sortie.println(db_name + " ");
                    System.out.println(db_name+ " ");
                    //System.out.println("Ici ça passe, YEAH !");
                    cpt++;
            }
            //sortie.println(cpt + " Row(s) Found");
            sortieVersClient.writeBytes(cpt + " Row(s) Found");     //Displays the number of rows returned.
            rs.close();                               //close the resultset
        } 
        catch (SQLException e) 
        {
            tool.display("Abnormal request execution");
        }
        catch(IOException exep)
        {
            System.out.println("Stream Problem");
        }           
    }


Ca, ça tourne côté serveur.

J'ai fais quelques test avec PrintWriter et DataOutputStream, voilà pourquoi les commentaires...

Côté client:

BufferedReader entreeClavier = new BufferedReader(new InputStreamReader(System.in));
            Socket connexion = new Socket("127.0.0.1", 9000);
            DataOutputStream sortie = new DataOutputStream(connexion.getOutputStream());
            //PrintWriter sortie = new PrintWriter(connexion.getOutputStream(), true);
            BufferedReader entreeDepuisServeur = new BufferedReader(new InputStreamReader(connexion.getInputStream()));
            String envoi=" ";
            boolean continu = true;
            while (true) 
            {
                
                while(continu=true)
                {
                    envoi = entreeClavier.readLine();
                    if(envoi.compareTo("status")==0)
                    {
                        continu=false;
                    }
                    else
                    {
                        System.out.println("Invalid Command");
                        System.out.println("Command available for the moment: status");
                    }
                }
                
                //sortie.println(envoi);
                sortie.writeBytes(envoi);
                System.out.println(envoi);
                
                String reponseDuServeur = entreeDepuisServeur.readLine();
                
                System.out.println("Recu du serveur: " + reponseDuServeur);
                
                connexion.close();
}
        }
        catch(IOException e) 
        { 
            System.out.println("Erreur : "+e); 
        }
        System.out.println("Connexion closed...");


Et ça c'est côté client...

Bon, où ai-je fais une bête erreur ? :oops:

Merci aux gens plus doués que moi ! ^^
0
ouranos21 Messages postés 9 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 14 janvier 2008
20 déc. 2007 à 16:28
EDIT:

J'ai oublié de vous coller quelques lignes de code...

public class ServeurThread 
{
  public static void main(String[] args) 
  {
    
    try 
    {
      ServerSocket service = new ServerSocket(9000); //On crée le Socket
      while (true) //boucle infinie
      {
        Socket connexion = service.accept();      //on lui demande d'attendre une requête client
        new ThreadConnexion(connexion).start(); //on instancie l'objet qui fait les traîtements
      }
    }
    catch (IOException e) 
    { 
    	System.err.println(e); 
    }
  }
  
  
}


public ThreadConnexion(Socket connexion) 
  {
    this.connexion = connexion;   
  }


/EDIT
0
Rejoignez-nous