Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2873 connectés 

 


 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  150  151  152  ..  327  328  329  330  331  332
Auteur Sujet :

BlaBlaTech@JAVA [ELITE, viendez les boobs]

n°1415864
souk
Tourist
Posté le 29-07-2006 à 23:18:30  profilanswer
 

Reprise du message précédent :


reste plus qu'a convaincre ma copine de partir la bas, ca va me faire chier de pas pouvoir continuer l'aventure :fou:
et accessoirement convaincre mwinmwin de viendre aussi :whistle:

mood
Publicité
Posté le 29-07-2006 à 23:18:30  profilanswer
 

n°1415869
Harkonnen
Un modo pour les bannir tous
Posté le 29-07-2006 à 23:28:59  profilanswer
 

à moi le 6000eme post de ce topic \o/


---------------
J'ai un string dans l'array (Paris Hilton)
n°1415871
kadreg
profil: Utilisateur
Posté le 29-07-2006 à 23:31:43  profilanswer
 

sale gosse :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°1415904
el muchach​o
Comfortably Numb
Posté le 30-07-2006 à 08:13:00  profilanswer
 

Bon, et la reponse a ma question ? :o
 
Bon c'est un peu ce que je pensais, faut que je place mes sleep/yield un peu plus finement:  
http://forum.java.sun.com/thread.j [...] ID=3100695


Message édité par el muchacho le 30-07-2006 à 08:41:21

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1415929
nraynaud
lol
Posté le 30-07-2006 à 12:24:59  profilanswer
 

el muchacho a écrit :

J'ai du en rater un bout alors. :/
Mais plus precisement ? Avec wait/notify ??
 
Le wait/notify sur la queue et le coup du marqueur de fin de liste... [:paysan]pas con ! Je devrais gagner en perf.
http://javaalmanac.com/egs/java.la [...] html?l=rel
Mais pour le polling I/O, je vois pas trop. Idealement, il me faudrait un evenement.


tu as le droit à synchronized et à des streams, si tu utilises plus, tu est mort :fou:

n°1415946
benou
Posté le 30-07-2006 à 13:32:35  profilanswer
 

el muchacho a écrit :


Mais plus precisement ? Avec wait/notify ??


regle1 : ne pas faire de multithreading en java si on ne connait pas les wait/notify

n°1415949
benou
Posté le 30-07-2006 à 13:35:33  profilanswer
 


 

Citation :

   public class WorkQueue {
        LinkedList queue = new LinkedList();
     
        // Add work to the work queue
        public synchronized void addWork(Object o) {
            queue.addLast(o);
            notify();
        }
     
        // Retrieve work from the work queue; block if the queue is empty
        public synchronized Object getWork() throws InterruptedException {
            while (queue.isEmpty()) {
                wait();
            }
            return queue.removeFirst();
        }
    }


 
il sert à quoi le while, là  :heink:
 
PS : et le private sur le membre de classe correspondant à la section critique, c'est pour les chiens ? :o


Message édité par benou le 30-07-2006 à 14:26:28
n°1416032
el muchach​o
Comfortably Numb
Posté le 30-07-2006 à 16:52:45  profilanswer
 

Bonnes remarques. J'ai remplacé le while par un if et ajouté le private dans ma version. Et de plus, leur marqueur de fin de liste NO_MORE_WORK est complètement inutile vu que le isEmpty() de la queue fait très bien l'affaire. Et d'ailleurs, à l'appel du get() par la fonction appelante, il n'y a plus besoin de faire le test. Même si j'ai rajouté un isEmpty à titre informatif (ça peut tjrs servir).  
Avec le wait/notify, je pense que j'ai gagné un petit peu en perfs (c'est moins saccadé), mais ça reste pas formidable, et le CPU est tjrs à 100%.


Message édité par el muchacho le 30-07-2006 à 17:11:21

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1416120
el muchach​o
Comfortably Numb
Posté le 30-07-2006 à 19:39:39  profilanswer
 

Ayé, c'était juste une histoire de sleep à mettre au bon endroit. Non seulement, ça trace sa mère, mais je suis tjrs à 0% de CPU.
Il est content Roscoe !  :sol:

Message cité 2 fois
Message édité par el muchacho le 30-07-2006 à 19:43:57

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1416146
Harkonnen
Un modo pour les bannir tous
Posté le 30-07-2006 à 21:20:10  profilanswer
 

t'avais mis ton sleep à l'envers ?


---------------
J'ai un string dans l'array (Paris Hilton)
mood
Publicité
Posté le 30-07-2006 à 21:20:10  profilanswer
 

n°1416174
nraynaud
lol
Posté le 30-07-2006 à 22:53:22  profilanswer
 

el muchacho a écrit :

Hello,
 
Comme vous le savez tous depuis au moins hier, j'ai fait un petit programme qui remplit une queue avec l'input de 3 fichiers, avec des threads daemons concurrents.
Les fichiers seront des fichiers de log régulièrement mis à jour par un autre process donc mes petits démons surveillent d'un oeil ce qui se passe. Tout ça fonctionne bien, mais ils ont la fâcheuse tendance à occuper 100% du CPU lorsqu'ils sont en attente de nouvelles lignes dans les fchiers en entrée, même lorsque je leur colle un sleep une fois qu'ils ont atteint la fin de fichier.
Une idée ?


 

el muchacho a écrit :

Ayé, c'était juste une histoire de sleep à mettre au bon endroit. Non seulement, ça trace sa mère, mais je suis tjrs à 0% de CPU.
Il est content Roscoe !  :sol:


nan mais ça va pas !
ça me rappelle quand j'ai fait passer notre batterie de tests de 80minutes à 18minutes : j'ai viré tous les sleep que les boulets avaient mis dans l'application.
 
 
ton appli doit bloquer soit sur un select soit sur un read bloquant soit sur un write bloquant d'après le problème que tu poses.

n°1416175
el muchach​o
Comfortably Numb
Posté le 30-07-2006 à 22:54:35  profilanswer
 

Harkonnen a écrit :

t'avais mis ton sleep à l'envers ?


Pire que ça. J'ai compris que ça se trainait quand j'ai vu les traces de freins. :whistle:


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1416176
benou
Posté le 30-07-2006 à 22:57:26  profilanswer
 

el muchacho a écrit :

Ayé, c'était juste une histoire de sleep à mettre au bon endroit. Non seulement, ça trace sa mère, mais je suis tjrs à 0% de CPU.


il attend quoi ton sleep ?  :heink:

n°1416182
el muchach​o
Comfortably Numb
Posté le 30-07-2006 à 23:10:34  profilanswer
 

nraynaud a écrit :

nan mais ça va pas !
ça me rappelle quand j'ai fait passer notre batterie de tests de 80minutes à 18minutes : j'ai viré tous les sleep que les boulets avaient mis dans l'application.
 
 
ton appli doit bloquer soit sur un select soit sur un read bloquant soit sur un write bloquant d'après le problème que tu poses.


Non, je pense que tu n'y es pas du tout. Le sleep est là pour éviter que les threads occupent inutilement 100% du CPU.
 
Voici la boucle principale des 3 threads qui lisent 3 fichiers de logs différents (en fait un seul est updaté à la fois, mais je ne peux pas savoir ni lequel ni quand, donc je lis bêtement les 3 en même temps).

Code :
  1. public void loopThroughFile(String fName, int startLineNum) throws OutOfMemoryError {
  2.         InputTextChannel myChannel = new InputTextChannel(fileName);
  3.        
  4.         try {
  5.          myChannel.open();
  6.       System.out.println("Looping through " + fileName + " from " + startLineNum);
  7.       try{
  8.        myChannel.reachLine(startLineNum);
  9.       while (!Thread.interrupted()) {
  10.        String line = myChannel.getLine();
  11.        if (line != null) {
  12.                  //Perform basic format verification before enqueuing
  13.         matcher = pattern.matcher(line);
  14.                  if (matcher.find()) {
  15.                   queue.put(line); // Thread-safe queue
  16.                  }
  17.                  else {
  18. //                  logger.error(fileName" + ":" + lineNum + " irregular input data." );
  19.                  }
  20.        }
  21.        else {
  22.         Thread.sleep(50);
  23.        }
  24.        line = null;
  25.       }
  26.       }       
  27.       catch(InterruptedException e){
  28. //             logger.error(fileName+" reading thread interrupted." );
  29.             }
  30.         }
  31.         catch (OutOfMemoryError e) {
  32.             //logger.error(fileName+" out of memory." );
  33.          throw new OutOfMemoryError();
  34.  }
  35.         finally {
  36.             myChannel.close();
  37.         }
  38.     }


 
Le seul point de synchronisation nécessaire est sur la queue, qui est partagée:

Code :
  1. import java.util.LinkedList;
  2. // Thread-safe message queue
  3. // Do not test for isEmpty() before get()
  4. // because isEmpty() needs another synchronization,
  5. // unless you need to do some special treatment when isEmpty() is true.
  6. public final class SynchedQueue
  7. {
  8.     private LinkedList queue = new LinkedList();
  9.     public synchronized void put(Object o){
  10.         queue.addLast(o);
  11.  notify();
  12.     }
  13.     public synchronized Object get() throws InterruptedException {
  14.  if (queue.isEmpty()) {
  15.             wait();
  16.  }
  17.  return queue.removeFirst();
  18.     }
  19.     public synchronized boolean isEmpty(){
  20.      return queue.isEmpty();
  21.     }
  22. }


 
et voici le prog de test:

Code :
  1. import java.util.Iterator;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. import java.io.*;
  5. public class InputFileReaderTest
  6. {
  7.     public static void main(String[] args) {
  8.         String[] files = {"test1.txt", "test2.txt", "test3.txt"};
  9.         String outfile = "output.txt";
  10.         List readers = new LinkedList();
  11.        
  12.         //Synchronized message queue - thread-safe
  13.         SynchedQueue queue = new SynchedQueue();
  14.        
  15.         try {
  16.             File file = new File(outfile);
  17.             if (!file.createNewFile()) {
  18.              System.out.println("Ouput file couldn't be created !!!" );
  19.             }
  20.         } catch (IOException e) {}
  21.        
  22.         System.out.println("Start of test" );
  23.         for(int i = 0; i < files.length; i++){
  24.             readers.add(new InputFileReader(files[i], queue));
  25.         }
  26.                
  27.      Iterator it = readers.iterator();
  28.      while(it.hasNext()){
  29.       InputFileReader th = (InputFileReader)(it.next());
  30.       //th.setPriority(java.lang.Thread.NORM_PRIORITY-1);
  31.       th.setDaemon(true);
  32.       th.start();
  33.      }
  34.    
  35.      try {
  36.   do {
  37.          System.out.println(queue.get());
  38.         } while(true);
  39.         }
  40.      catch(InterruptedException e){}
  41.     }
  42. }


 
Si j'enlève le sleep, le thread se met à boucler à toute allure même si getline ne retourne pas de nouvelle ligne (de log). Ca fout la dèche, ça fonctionne, mais de façon cahotique, avec des moments où les threads se marchent sur les pieds et un scheduler qui perd les pédales. Alors qu'avec, ça roule.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1416183
nraynaud
lol
Posté le 30-07-2006 à 23:13:23  profilanswer
 

muchacho > pipe nomé ?

n°1416185
nraynaud
lol
Posté le 30-07-2006 à 23:15:04  profilanswer
 

nan, mais là c'est zéro en fait quoi.
 
bon, on va tout reprendre lentement.  
 
C'est quoi précisément ton besoin ?

n°1416187
benou
Posté le 30-07-2006 à 23:20:58  profilanswer
 

ton catch OurOfMemeoryException il sert à rien à part ne pas fermer ton channel ...
et le throws OutOfMemoryException a pas d'utilité ...  
 
c'est quoi InputTextChannel  ?? pkoi sa méthode getLine() n'est pas bloquante ?
 
(rien de surprenant que ça prenait 100% de CPU sans le sleep ton machin)

n°1416189
el muchach​o
Comfortably Numb
Posté le 30-07-2006 à 23:28:19  profilanswer
 

Oulala  :whistle:  
 
Bon je vous mets le code complet.  
Ne faites pas attention au code commenté, il sera dans le code de production avec la javadoc qui va bien, mais là, c'est juste un test. J'ajouterai sans doute aussi des méthodes pour tuer proprement le thread.
 

Code :
  1. /*  
  2. * InputFileReader.java -   
  3. * This class implements a thread that reads a file  
  4. * and fills a synchronized message queue with the new input.
  5. * Basic message structure verification is done before accepting a new input.
  6. */
  7. import java.io.*;
  8. import java.util.regex.*;
  9. final class InputFileReader extends Thread
  10.     /*
  11.      * This class implements a file channel.
  12.      * One must first open() it before use.
  13.      * It returns every line in the file.
  14.      */
  15.     public final class InputTextChannel
  16.     {
  17.         String fileName;
  18.         FileReader reader;
  19.         LineNumberReader buffer;
  20.         final int TenKb = 10240; // Buffer size
  21.        
  22.         InputTextChannel(String fileName) {
  23.             this.fileName = fileName;
  24.         }
  25.        
  26.         boolean open() {
  27.             try {
  28.                 reader = new FileReader(fileName);
  29.                 buffer = new LineNumberReader(reader, TenKb);
  30.                 return true;
  31.             }
  32.             catch(FileNotFoundException e) {
  33.                 System.out.println("Couldn't find file." );
  34.                 return false;
  35.             }
  36.             catch(OutOfMemoryError e) {
  37.                 System.out.println("Out of memory." );
  38.                 Thread.dumpStack();
  39.                 return false;
  40.             }
  41.         }
  42.      
  43.         // return the next text line read in the file
  44.      public String getLine() {
  45.       String line = null;
  46.       try {
  47.        if (buffer.ready()) {
  48.         line = buffer.readLine();
  49.        }
  50.          }
  51.       catch (IOException ex) {
  52.        //logger.error("Warning: Couldn't read line " + fileName + ":"+ String(buffer.getLineNumber()));
  53.                 System.out.println(fileName + ": Couldn't read line " + buffer.getLineNumber());
  54.             }
  55.       return line;
  56.      }
  57.    
  58.         boolean close() {
  59.          boolean success = false;
  60.          try {
  61.           buffer.close();
  62.           reader.close();
  63.           success  = true;
  64.          }
  65.          catch(IOException e){
  66.        Thread.dumpStack();
  67.        success = false;
  68.          }
  69.          return success;
  70.         }
  71.         // Go to line given in parameter
  72.         // @param lineNumber
  73.         public void reachLine(int lineNumber) {
  74.           try {
  75.                 for (int l = 0; l < lineNumber; l++) {
  76.            if (buffer.ready()) {
  77.             buffer.readLine();
  78.            }
  79.                 }
  80.             }
  81.             catch (IOException e) {
  82.                 //logger.error("Warning: Couldn't read line " + fileName + ":"+ String(mBufferLine.getLineNumber()));
  83.                 System.out.println("Couldn't read line." + fileName + ":" + buffer.getLineNumber());
  84.             }
  85.         }
  86.     }
  87.    
  88.     private String fileName;
  89.     private SynchedQueue queue;
  90.     private Pattern pattern;
  91.     private Matcher matcher;
  92.    
  93.     // @param fileName name of the file to be read
  94. public InputFileReader(String fileName, SynchedQueue queue) {
  95.         this.fileName  = fileName;
  96.         this.queue   = queue;
  97. }
  98.     /*
  99.      * Wait until the file has been created.  
  100.  *  Yield thread if it doesn't exist
  101.  * @param fName name of the file to be tested
  102.  */
  103.     public void waitForFile(String fName) {
  104.      File path = new File(fName);
  105.      System.out.println("Waiting for " + fileName);
  106.      while(path.isFile() == false) {
  107.       Thread.yield();
  108.      }
  109.     }
  110.     /*  
  111.  * Main loop of the thread. Read the input file line by line and fill the message queue.
  112.      * @param fName : file name, startLineNum : start line number
  113.      * @return void
  114.      * @throws OutOfMemoryError
  115.  */
  116.     public void loopThroughFile(String fName, int startLineNum) throws OutOfMemoryError {
  117.         InputTextChannel myChannel = new InputTextChannel(fileName);
  118.        
  119.         try {
  120.          myChannel.open();
  121.       System.out.println("Looping through " + fileName + " from " + startLineNum);
  122.       try{
  123.        myChannel.reachLine(startLineNum);
  124.       while (!Thread.interrupted()) {
  125.        String line = myChannel.getLine();
  126.        if (line != null) {
  127.                  //Perform basic format verification before enqueuing
  128.         matcher = pattern.matcher(line);
  129.                  if (matcher.find()) {
  130.                   queue.put(line); // Thread-safe queue
  131.                  }
  132.                  else {
  133. //                  logger.error(fileName" + ":" + lineNum + " irregular input data." );
  134.                  }
  135.        }
  136.        else {
  137.         Thread.sleep(50);
  138.        }
  139.        line = null;
  140.       }
  141.       }       
  142.       catch(InterruptedException e){
  143. //             logger.error(fileName+" reading thread interrupted." );
  144.             }
  145.         }
  146.         catch (OutOfMemoryError e) {
  147.             //logger.error(fileName+" out of memory." );
  148.          throw new OutOfMemoryError();
  149.  }
  150.         finally {
  151.             myChannel.close();
  152.         }
  153.     }
  154.    
  155. /*
  156.  * Read the XML configuration file
  157.  * and perform the necessary initializations
  158.  */
  159. boolean init() {
  160.  //String REGEX = "^\\d{2}:\\d{2}:\\d{2}";
  161.  String REGEX = "^\\d{2}|^End";
  162.  try {
  163.          pattern = Pattern.compile(REGEX);
  164.  // etc
  165.         }
  166.         catch(PatternSyntaxException e) {
  167.             //logger.error("Fatal: Regex expression incorrect !" );         
  168.         }
  169.         return true;
  170. }
  171. /*
  172.  * Query the DB for the last file/line that was written  
  173.  * in log files before failure/shutdown
  174.  */
  175. int performRecover() {
  176.  return 4;
  177. }
  178.     /*  
  179.  * Main thread run.
  180.      */
  181.     public void run() {
  182.        
  183.         boolean ok = init();
  184.  if (ok) {
  185.   // We first determine which line to start with
  186.   int startLineNum = 0;
  187.   startLineNum = performRecover();
  188.   //We wait until the file is ready to be read.
  189.   waitForFile(fileName);
  190.   // Read the file.
  191.   loopThroughFile(fileName, startLineNum);
  192.  }
  193.     }
  194. }

Message cité 1 fois
Message édité par el muchacho le 30-07-2006 à 23:34:47

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1416190
nraynaud
lol
Posté le 30-07-2006 à 23:33:36  profilanswer
 

c'est quoi le but du programme ?

n°1416192
souk
Tourist
Posté le 30-07-2006 à 23:41:36  profilanswer
 

[:pingouino] [:pingouino]

n°1416194
nraynaud
lol
Posté le 30-07-2006 à 23:45:25  profilanswer
 

souk > ton logiciel se fait démonter dans un "better software", il est passé au PMD.

n°1416195
el muchach​o
Comfortably Numb
Posté le 30-07-2006 à 23:48:50  profilanswer
 

nraynaud a écrit :

c'est quoi le but du programme ?


Bon je t'explique le contexte. C'est un serveur qui fait un certains nombre de statistiques sur des données qui lui sont filées en temps réel, actuellement via des fichiers de log, plus tard via des sockets (ce que je suis en train d'implémenter). Le pb, c'est que le soft qui pond les logs peut indifféremment écrire sur un fichier de log, ou sur 2 (ou n) de façon cyclique: au bout d'un moment (toutes les 24h, ou au bout de x Mo), il décide de passer au suivant, de faire une copie d'archives du premier, et vice versa.  Comme je ne sais pas quand le switch arrive, je suis obligé de monitorer les 2 à la fois, sachant que je dois pouvoir traiter 500 lignes/sec. Là, ce n'est pas la queue qui va limiter, vu que je suis à ~25000/sec sur mon PC (avec les sleep). Avec les sockets, il n'y aura pas ce genre de pb.
La pertie recover, tu peux oublier, c'est au cas ou on l'arrête (ou en cas de crash), on enregistre régulièrement le nom du fichier et la ligne du dernier traitement, et il recommencera ses stats à l'endroit où il s'est arrêté, ce qui évite de fausser les résultats.
 
Il y a au moins 2 bugs qu'il faut que je corrige dans ce prog:
- si aucun des fichiers n'est créé, ça yield à toute allure et le CPU est à 100% -> sleep à la place du yield.
- on ne traite pas le cas où un des fichiers est effacé en cours de route.

Message cité 1 fois
Message édité par el muchacho le 31-07-2006 à 00:06:21

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1416197
souk
Tourist
Posté le 30-07-2006 à 23:51:43  profilanswer
 

nraynaud a écrit :

souk > ton logiciel se fait démonter dans un "better software", il est passé au PMD.


ca m'etonne pas [:dawa] , a chaque fois que je dois mettre les pieds dans le code ca me fait mal aux yeux [:dawa]
mais bon je bosse pas du tout sur le client moi en fait [:dawao]

n°1416200
nraynaud
lol
Posté le 30-07-2006 à 23:57:18  profilanswer
 

el muchacho a écrit :

Bon je t'explique le contexte. C'est un serveur qui fait un certains nombre de statistiques sur des données qui lui sont filées en temps réel, actuellement via des fichiers de log, plus tard via des sockets (ce que je suis en train d'implémenter). Le pb, c'est que le soft qui pond les logs peut indifféremment écrire sur un fichier de log, ou sur 2 (ou n) de façon cyclique: au bout d'un moment (toutes les 24h, ou au bout de x Mo), il décide de passer au suivant, de faire une copie d'archives du premier, et vice versa.  Comme je ne sais pas quand le switch arrive, je suis obligé de monitorer les 2 à la fois, sachant que je dois pouvoir traiter 500 lignes/sec. Là, ce n'est pas la queue qui va limiter, vu que je suis à ~25000/sec sur mon PC (avec les sleep). Avec les sockets, il n'y aura pas ce genre de pb.


j'assaie de reformuler :
t'as un logiciel qui pond des logs un peu en vrac dans des fichiers.
t'as un logiciel qui veut bouffer les logs dans l'ordre dans une queue.
 
j'ai bon ?
 
qui fabrique le logiciel qui pond ses trucs en vrac ? ce quelle logique il choisi ses fichiers pour écrire ? pourquoi est-ce que tu peux intevenir dessus pour transformer la chose en sockets, mais pas pour lui faire pondre une queue comme elle te plairait ?
 
est-ce qu'il ne serait pas plus rapide de faire faire une socket au producteur de logs que de te battre (et perdre à ce que je vois) contre des fichiers de logs en vrac ?
 
le logiciel qui consome la queue pour faire des stats, il est en java aussi ?

n°1416201
nraynaud
lol
Posté le 30-07-2006 à 23:59:34  profilanswer
 

ça se voit que je suis en train de lire un bouquin sur le coaching ? [:pingouino]

n°1416202
el muchach​o
Comfortably Numb
Posté le 31-07-2006 à 00:04:31  profilanswer
 

nraynaud a écrit :

j'assaie de reformuler :
t'as un logiciel qui pond des logs un peu en vrac dans des fichiers.
t'as un logiciel qui veut bouffer les logs dans l'ordre dans une queue.
 
j'ai bon ?
 
qui fabrique le logiciel qui pond ses trucs en vrac ? ce quelle Ouilogique il choisi ses fichiers pour écrire ? pourquoi est-ce que tu peux intevenir dessus pour transformer la chose en sockets, mais pas pour lui faire pondre une queue comme elle te plairait ?


Oui c'est ça. Et le logiciel qui pond les logs en vrac est un gros système sur lequel je ne peux pas intervenir. Il est installé chez divers grands comptes et chacun le configure comme il l'entend. Il y a un moyen pour que les données puissent être envoyées via sockets et non fichiers. Il faut que je gère le plus large cas de figure possible.  

Citation :

est-ce qu'il ne serait pas plus rapide de faire faire une socket au producteur de logs que de te battre (et perdre à ce que je vois) contre des fichiers de logs en vrac ?


Non, voir au-dessus. Et mon programme-test fonctionne de façon satisfaisante.

Citation :

le logiciel qui consome la queue pour faire des stats, il est en java aussi ?


Yep.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1416203
nraynaud
lol
Posté le 31-07-2006 à 00:11:16  profilanswer
 

bon, imaginons que scanner les fichiers soit la meilleure méthode.
première chose : la date de dernière modif de tes fichiers, ça serait pas mieux qu'un scan en O(n) pour savoir s'il y a eu une modif ?
 
Comment se présente le logiciel de monitoring ? c'est une interface graphique qui se met à jour périodiquement ?

n°1416204
benou
Posté le 31-07-2006 à 00:12:07  profilanswer
 


c'est le mot  :sweat:  
 
attention, je commente ...
 

Code :
  1. final class InputFileReader extends Thread


1) pkoi ta classe est finale ?? t'as une bonne raison d'empêcher qu'on en hérite par la suite ??
2) extends Thread c'est mal. implemente Runnable, et gère ton thread de façon indépendante. C'est plus propre et c'ets plus ouvert.
 

Code :
  1. public final class InputTextChannel


mais pkoi encore final ??  :heink:  
 

Code :
  1. String fileName;
  2.        FileReader reader;
  3.        LineNumberReader buffer;
  4.        final int TenKb = 10240; // Buffer size


manque les modifiers devant tes champs ... par défaut mets les private.
là je n'ai pas lu plus loin, mais des buffersize, en java, ça se fait rare ... c'est surement une erreur.
les variables c'est en minuscule la première lettre les constant c'est en majuscule toutes les lettres (cf les conventions de codage java)
 

Code :
  1. boolean open() {
  2.             try {
  3.                 reader = new FileReader(fileName);
  4.                 buffer = new LineNumberReader(reader, TenKb);
  5.                 return true;
  6.             }
  7.             catch(FileNotFoundException e) {
  8.                 System.out.println("Couldn't find file." );
  9.                 return false;
  10.             }
  11.             catch(OutOfMemoryError e) {
  12.                 System.out.println("Out of memory." );
  13.                 Thread.dumpStack();
  14.                 return false;
  15.             }
  16.         }


manque le modifier (public, j'imagine)
les code de retour, c'est bon pour le C, en java on utilise les exceptions pour signaler les problèmes d'execution.. là par exemple tu n'as aucune raison de cacher le FileNotFoundException à l'appelant
pourquoi tu conserves une référence sur le reader si tu le wrappes dans un LineNumberReader ?
pourquoi tu fixes la taille de buffer à ton LineReader ? t'as une bonne raison de le faire ?? tu t'attends à avoir des lignes énormes ?  
le catchOutOfMemoryException il sert vraiment à rien ... de toute façon, sauf cas particulier, oublie les catch catchOutOfMemoryException ...
 

Code :
  1. // return the next text line read in the file
  2.      public String getLine() {
  3.       String line = null;
  4.       try {
  5.        if (buffer.ready()) {
  6.         line = buffer.readLine();
  7.        }
  8.          }
  9.       catch (IOException ex) {
  10.        //logger.error("Warning: Couldn't read line " + fileName + ":"+ String(buffer.getLineNumber()));
  11.                 System.out.println(fileName + ": Couldn't read line " + buffer.getLineNumber());
  12.             }
  13.       return line;
  14.      }


si y a un endroit où tu dois faire ta bidouille avec ta boucle et le sleep, c'est ici. La méthode getLine devrait être bloquante (jusqu'à ce qu'elle ait lu une ligne.
il faut vraiment que tu apprennes à gérer correctement tes exceptions.
 
(je m'arrête là, parce que ça va encore être long sinon)

Message cité 1 fois
Message édité par benou le 31-07-2006 à 00:20:26
n°1416208
el muchach​o
Comfortably Numb
Posté le 31-07-2006 à 00:28:04  profilanswer
 

benou a écrit :

c'est le mot  :sweat:  
 
attention, je commente ...


Vas-y. :p  
 

Citation :

final class InputFileReader extends Thread
1) pkoi ta classe est finale ?? t'as une bonne raison d'empêcher qu'on en hérite par la suite ??

Code :
  1. public final class InputTextChannel


mais pkoi encore final ??  :heink:  


 
Oui, elle n'est pas prévue pour, donc je la mets en final. Lu sur "Effective Java" de Joshua Bloch (redesigner d'une bonne partie de la JDK): si ta classe n'est pas expressément pensée pour être héritée, il vaut mieux la mettre en final.
 

Citation :

2) extends Thread c'est mal. implemente Runnable, et gère ton thread de façon indépendante. C'est plus propre et c'ets plus ouvert.

[/quote]
Ouais, je sais aussi. Je vais sûrement faire comme tu dis.
 
 
 

Citation :

Code :
  1. String fileName;
  2.        FileReader reader;
  3.        LineNumberReader buffer;
  4.        final int TenKb = 10240; // Buffer size


manque les modifiers devant tes champs ... par défaut mets les private.


 :jap: Oubli de ma part.

Citation :

là je n'ai pas lu plus loin, mais des buffersize, en java, ça se fait rare ... c'est surement une erreur.


En fait, c'est un reste de C++.

Citation :

les variables c'est en minuscule la première lettre les constant c'est en majuscule toutes les lettres (cf les conventions de codage java)


De toute façon, TenKb, c'est un nom complètment con. :D  
 
 

Citation :


si y a un endroit où tu dois faire ta bidouille avec ta boucle et le sleep, c'est ici. La méthode getLine devrait être bloquante (jusqu'à ce qu'elle ait lu une ligne.
il faut vraiment que tu apprennes à gérer correctement tes exceptions.
 
(je m'arrête là, parce que ça va encore être long sinon)


J'y ai pensé, mais j'ai préféré le sortir pour le cas le code serait réutilisé. Après réflexion, tu as sans doute raison.


Message édité par el muchacho le 31-07-2006 à 00:36:36

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1416214
benou
Posté le 31-07-2006 à 00:34:02  profilanswer
 

Citation :

Lu sur "Effective Java" de Joshua Bloch (redesigner d'une bonne partie de la JDK): si ta classe n'est pas expressément pensée pour être héritée, il vaut mieux la mettre en final.


 [:mlc2]  
première fois que j'entends ça ... je trouve pas que ce soit une bonne idée ...
même si je pense qu'il a raison et qu'une classe non prévue pour être héritée ne le sera surement pas ou mal, mais je vois pas de raison de l'empêcher "à priori".

n°1416215
nraynaud
lol
Posté le 31-07-2006 à 00:35:25  profilanswer
 

disons, qu'il ne faut pas las la couper "a priori" parce que c'est un bon moyen pour un mec qui passe derrière d'essayer de la tester ou de la faire rentrer dans un truc rigide à la con.

n°1416217
benou
Posté le 31-07-2006 à 00:37:27  profilanswer
 

nraynaud a écrit :

disons, qu'il ne faut pas las la couper "a priori" parce que c'est un bon moyen pour un mec qui passe derrière d'essayer de la tester ou de la faire rentrer dans un truc rigide à la con.


tu veux couper quoi ?
et de ce que je comprends de ta phrase, le début va dans l'autre sens que la fin ...


Message édité par benou le 31-07-2006 à 00:37:44
n°1416218
nraynaud
lol
Posté le 31-07-2006 à 00:39:15  profilanswer
 

la possibilité d'hériter

n°1416219
el muchach​o
Comfortably Numb
Posté le 31-07-2006 à 00:39:34  profilanswer
 

benou a écrit :

Citation :

Lu sur "Effective Java" de Joshua Bloch (redesigner d'une bonne partie de la JDK): si ta classe n'est pas expressément pensée pour être héritée, il vaut mieux la mettre en final.


 [:mlc2]  
première fois que j'entends ça ... je trouve pas que ce soit une bonne idée ...
même si je pense qu'il a raison et qu'une classe non prévue pour être héritée ne le sera surement pas ou mal, mais je vois pas de raison de l'empêcher "à priori".


Justement, c'est comme ça qu'on se retrouve avec des hiérarchies de classes pourries qui empêchent toute modification par la suite. Et ça c'est la plaie. Donc soit on fait une belle interface et on dit : allez-y, soit on se blinde en la mettant final. Je pense que c'est l'idée.
Sur ce bonne nuit.

Message cité 1 fois
Message édité par el muchacho le 31-07-2006 à 00:40:57

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°1416220
nraynaud
lol
Posté le 31-07-2006 à 00:40:59  profilanswer
 

bon, au lieu de débats techniques à la con, mucha si tu répondais à mes questions ?

n°1416222
benou
Posté le 31-07-2006 à 00:41:18  profilanswer
 

el muchacho a écrit :

Justement, c'est comme ça qu'on se retrouve avec des hiérarchies de classes pourries qui empêchent toute modification par la suite. Et ça c'est la plaie. Donc soit on fait une belle interface et on dit : allez-y, soit on se blinde en la mettant final. Je pense que c'est l'idée.


bha tu sais, si le mec il est prêt à faire une hierarchie pourrie, il sera prêt à virer un final qui l'emmerde ...
 
mais bon, de toute façon, l'héritage c'est mal :o


Message édité par benou le 31-07-2006 à 00:42:04
n°1416224
nraynaud
lol
Posté le 31-07-2006 à 00:43:23  profilanswer
 

bon bah bonne nuit alors
 
c'est cool, je reste éveillé pour tenter de l'aider, il se tire en laissant son code pourri et en répondant même pas aux questions [:pingouino]
 
Je sais à quoi m'en tenir la prochaine fois qu'il critiquera un logiciel ou un dev remarque.

n°1416225
nraynaud
lol
Posté le 31-07-2006 à 00:44:44  profilanswer
 

on dirait le plugin d'harko tiens [:pingouino]

n°1416227
the real m​oins moins
Posté le 31-07-2006 à 00:48:54  profilanswer
 

:jap:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1416248
benou
Posté le 31-07-2006 à 07:38:51  profilanswer
 

nraynaud a écrit :

on dirait le plugin d'harko tiens [:pingouino]


pas la peine de devenir désagréable :o

n°1416266
Harkonnen
Un modo pour les bannir tous
Posté le 31-07-2006 à 09:24:56  profilanswer
 

nraynaud a écrit :

on dirait le plugin d'harko tiens [:pingouino]


attends de voir le source avant de juger [:pingouino]


---------------
J'ai un string dans l'array (Paris Hilton)
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  150  151  152  ..  327  328  329  330  331  332

Aller à :
Ajouter une réponse
 

Sujets relatifs
[java]Ouvrir un fichier dans la fenetre principaleformation pour developpeurs Java
crontab : programme java[JAVA] Aide pour packager un jar
[java] copie de fichier et progressbarinstallation java
[JAVA]Comment insérer un texte dans un fichier audio?[JAVA] Intégrer ANT : API ou ligne de commande ?
[Java][Bouley]Serializable : mauvaise instanciation des champs[JAVA : JNI] Pb a l'execution avec library
Plus de sujets relatifs à : BlaBlaTech@JAVA [ELITE, viendez les boobs]


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)