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

 


 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  271  272  273  ..  327  328  329  330  331  332
Auteur Sujet :

BlaBlaTech@JAVA [ELITE, viendez les boobs]

n°2006986
charly007
Posté le 04-07-2010 à 20:08:59  profilanswer
 

Reprise du message précédent :
Je ne sais pas ce qu'apporte le papier en soit, mais sa préparation te fera apprendre ou clarifier beaucoup de choses.
Par contre je pense qu'il est préférable de la passer après quelques années d'expérience.


Message édité par charly007 le 04-07-2010 à 20:10:23
mood
Publicité
Posté le 04-07-2010 à 20:08:59  profilanswer
 

n°2007290
LeRiton
Posté le 06-07-2010 à 08:28:25  profilanswer
 

Bonjour,

 

Je crois qu'il y en a au moins un ici qui bosse sous Maven, donc sait-on jamais  [:neriki]

 

Je me heurte au message d'erreur suivant lorsque je tente de construire l'EAR d'une application toute simple, un EJB Jar et un WAR.

 

Mon POM :

Code :
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3.  
  4.     <modelVersion>4.0.0</modelVersion>
  5.     <groupId>com.toto</groupId>
  6.     <artifactId>server</artifactId>
  7.     <packaging>ear</packaging>
  8.     <version>0.0.1-SNAPSHOT</version>
  9.     
  10.     <dependencies>
  11.  
  12.         <dependency>
  13.             <groupId>com.toto</groupId>
  14.             <artifactId>ejb-forward</artifactId>
  15.             <version>0.0.1-SNAPSHOT</version>
  16.             <type>ejb</type>
  17.         </dependency>
  18.  
  19.         <dependency>
  20.             <groupId>com.toto</groupId>
  21.             <artifactId>webstart-client</artifactId>
  22.             <version>0.0.1-SNAPSHOT</version>
  23.             <type>war</type>
  24.         </dependency>
  25.  
  26.     </dependencies>
  27.  
  28.     <build>
  29.         <plugins>
  30.  
  31.             <plugin>
  32.                 <groupId>org.apache.maven.plugins</groupId>
  33.                 <artifactId>maven-ear-plugin</artifactId>
  34.                 <version>2.4.2</version>
  35.                 <configuration>
  36.                     <version>5</version>
  37.                     <modules>
  38.  
  39.                         <ejbModule>
  40.                             <groupId>com.toto</groupId>
  41.                             <artifactId>ejb-forward</artifactId>
  42.                         </ejbModule>
  43.  
  44.                         <webModule>
  45.                             <groupId>com.toto</groupId>
  46.                             <artifactId>webstart-client</artifactId>
  47.                             <contextRoot>/client</contextRoot>
  48.                         </webModule>
  49.  
  50.                     </modules>
  51.                 </configuration>
  52.             </plugin>
  53.         </plugins>
  54.         
  55.     </build>
  56. </project>
 

L'erreur qui survient est la suivante :

Citation :

Embedded error: Unknown artifact type[test-jar]

 

Et l'explication donnée la plus fréquemment est celle ci, "You have a test-jar without a scope test so the ear plugin tries to package it since it's not scoped properly."

 

Mais aucune des dépendances de mes projets n'a de Jar de test sans le scope qui va bien (ça se résume à Junit pour les deux).

 

Que dois-je comprendre ? Qu'une de mes dépendances transitive a un scope foireux ?

 

Merci de m'apporter une piste.


Message édité par LeRiton le 06-07-2010 à 08:29:41
n°2007616
the real m​oins moins
Posté le 06-07-2010 à 23:54:51  profilanswer
 

mvn dependency:tree|grep test


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°2007628
TBone
Pouet.
Posté le 07-07-2010 à 03:22:44  profilanswer
 

tiens, vous utilisez quoi comme outil pour surveiller vos logs ? j'ai une quarantaine de logs à surveiller afin d'en générer des alertes sur la console principale... (il y a principalement du log4j et du jdk-log mais un peu de slf4j aussi)


---------------
A straight line is a special case of a curve. It's a curve which is uncurved. -- Susskind.
n°2007634
el muchach​o
Comfortably Numb
Posté le 07-07-2010 à 08:19:08  profilanswer
 

Sur Windows, je me souviens qu'il y a un outil assez puissant qui permet de définir des règles avec un langage proche du SQL pour faire des requêtes sur les logs. C'est malheureusement uniquement widows.

 

Sinon, si tu veux te faire plaisir, tu peux écrire un outil de ce genre en te basant sur un complex event processor comme Esper. Tu n'as qu'à écrire un parseur pour tes logs avec des regex, par exemple, et ensuite tu peux définir n'importe quelle règle de filtrage, sélection, corrélation, sur les N derniers logs, les N dernières minutes, etc, les enregistrer en SQL dans une base de données embarquée comme H2  et/ou lever des alertes ou déclencher n'importe quelle action avec. J'avais écrit un outil similaire, ça marche très bien, tu peux parser et filtrer des dizaines de milliers de logs par seconde avec ce système, créer autant de règles que tu veux en temps réel et sans avoir à l'arrêter. Pour le parseur, plutôt qu'avoir à écrire une classe à chaque type de log (si tu logges plusieurs sorties différentes), j'avais intégré un langage de script et c'était lui qui parsait les logs. Tu perds en performance mais tu gagnes énormément en flexibilité.


Message édité par el muchacho le 07-07-2010 à 08:33:40

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2007637
TBone
Pouet.
Posté le 07-07-2010 à 08:35:08  profilanswer
 

c'est ce que je pensais faire aussi mais je voulais avoir un feedback avant car j'ai l'art de réinventer la roue :)

 

edit> j'vais testouiller Splunk, il a l'air propre sur lui.

Message cité 1 fois
Message édité par TBone le 07-07-2010 à 08:49:31

---------------
A straight line is a special case of a curve. It's a curve which is uncurved. -- Susskind.
n°2007638
LeRiton
Posté le 07-07-2010 à 08:47:22  profilanswer
 

the real moins moins a écrit :

mvn dependency:tree|grep test


 
Pas con...
 
Le Jar incriminé est celui-ci
[INFO] |  |  |  |  +- org.jboss.jbossas:jboss-as-j2se:test-jar:tests:5.1.0.GA:compile
 
Son parent direct est jboss-as-jmx, mais tout ça viens d'une dépendance globale à jboss-as-client pour la partie EJB de cet EAR. En y regardant à nouveau et en passant le scope à provided, ça fonctionne.
 
Merci  [:romf]

n°2007870
the real m​oins moins
Posté le 07-07-2010 à 19:44:07  profilanswer
 

LeRiton a écrit :


 
Pas con...
 
Le Jar incriminé est celui-ci
[INFO] |  |  |  |  +- org.jboss.jbossas:jboss-as-j2se:test-jar:tests:5.1.0.GA:compile
 
Son parent direct est jboss-as-jmx, mais tout ça viens d'une dépendance globale à jboss-as-client pour la partie EJB de cet EAR. En y regardant à nouveau et en passant le scope à provided, ça fonctionne.
 
Merci  [:romf]


c'est un gros tas de tanches sur leurs poms chez jboss.. (et quand c'est pas les dépendences, c'est vas-y que je te refourgue le repo-jboss qui est un mirror de central + leurs trucs + des trucs louches..)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°2007878
LeRiton
Posté le 07-07-2010 à 20:27:28  profilanswer
 

C'est pas faux  [:beecher]  
 
D'un autre côté, pour ce cas bien précis c'était de ma faute :D
Autant y'avait pas lieu de trouver un test-jar à cet endroit, autant ce type de dépendances pour des EJB sont provided.

n°2007889
el muchach​o
Comfortably Numb
Posté le 07-07-2010 à 21:24:59  profilanswer
 

TBone a écrit :

c'est ce que je pensais faire aussi mais je voulais avoir un feedback avant car j'ai l'art de réinventer la roue :)
 
edit> j'vais testouiller Splunk, il a l'air propre sur lui.


Ca a l'air d'aller au-dela du simple monitoring, cet outil, il permet de faire du data mining; et il a l'avantage d'avoir la partie reporting intégrée, c'est déjà ça de gagné. Bon, avec mon système, on peut faire la même chose, mais il faut un peu tout se coltiner à la mimine.
Sinon, le truc dont je parlais sous Windows, c'est Log parser. Y 'a même une GUI.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
mood
Publicité
Posté le 07-07-2010 à 21:24:59  profilanswer
 

n°2007932
TBone
Pouet.
Posté le 08-07-2010 à 08:34:35  profilanswer
 

el muchacho a écrit :

Ca a l'air d'aller au-dela du simple monitoring, cet outil, il permet de faire du data mining; et il a l'avantage d'avoir la partie reporting intégrée, c'est déjà ça de gagné. Bon, avec mon système, on peut faire la même chose, mais il faut un peu tout se coltiner à la mimine.


toutafé, le truc qui nous intéresse est le parsing, le reporting compatible "décideur-pressé" et surtout la remontée d'alerte un rien intelligente car on doit remonter les alertes vers notre console de production (mais pas d'alertes récurrentes, avec statuts de reprise après panne si dispo, filtrage car certains framework utilisés chez nous stackent en severe de simples warning,...)

el muchacho a écrit :

Sinon, le truc dont je parlais sous Windows, c'est Log parser. Y 'a même une GUI.


je vais aller jeter un oeil dessus
 
:jap:


---------------
A straight line is a special case of a curve. It's a curve which is uncurved. -- Susskind.
n°2008695
el muchach​o
Comfortably Numb
Posté le 11-07-2010 à 15:51:09  profilanswer
 

Putain de thread qui bloque dans DestroyJavaVM. :/

 

Ca vous dit qq chose ?

 

edit: putain d'interblocage à la mort des threads.

 

Pour le contexte, j'écris un petit pattern producteurs-consommateurs. Tout va bien jusqu'au moment où l'on veut que tout ça meure. Là, de façon aléatoire, certains threads veulent bien mourir, et pas d'autres. C'est dû au fait que la BlockingQueue est bloquante sur l'insertion (put) et le retrait (take).
Si on insère massivement dans la queue, elle bloque le thread producteur jusqu'à ce qu'une place soit libérée. Il peut donc y avoir blocage des producteurs si on tue les threads consommateurs.
A l'inverse, si on tue les producteurs, les consommateurs sont bloqués sur la fonction take et je ne pouvais plus les tuer.
J'ai donc protéger la queue contre le risque qu'elle soit complètement pleine ou complètement vide.
Mais visiblement, ça n'est pas suffisant. :/

Message cité 1 fois
Message édité par el muchacho le 11-07-2010 à 17:50:58

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2008697
masklinn
í dag viðrar vel til loftárása
Posté le 11-07-2010 à 16:57:26  profilanswer
 

el muchacho a écrit :

Putain de thread qui bloque dans DestroyJavaVM. :/

 

Ca vous dit qq chose ?

 

edit: putain d'interblocage à la mort des threads.

 

Pour le contexte, j'écris un petit pattern producteurs-consommateurs. Tout va bien jusqu'au moment où l'on veut que tout ça meure. Là, de façon aléatoire, certains threads voulaient bien mourir, et pas d'autres. C'était dû au fait que la BlockingQueue est bloquante sur l'insertion (put) et le retrait (take).
Si on insère massivement dans la queue, elle bloque le thread producteur jusqu'à ce qu'une place soit libérée. Il peut donc y avoir blocage des producteurs si on tue les threads consommateurs.
A l'inverse, si on tue les producteurs, les consommateurs sont bloqués sur la fonction take et je ne pouvais plus les tuer.
Il faut donc protéger la queue contre le risque qu'elle soit complètement pleine ou complètement vide.


http://download.oracle.com/docs/cd [...] n(boolean)

 

Sachant qu'avec ça tu peux avoir des threads tués en plein vol, habituellement tes consommateurs sont daemonifiés, tu stop le thread producteur puis tu join sur ta queue (histoire de finir toutes les tâches en cours, enfin cette partie là va un peu dépendre de la manière dont ton queuing fonctionne) et quand la queue est vide tu tues le tout (les consommateurs vont gentiment mourir allors qu'ils seront en train de bloquer sur un take)


Message édité par masklinn le 11-07-2010 à 17:00:32

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2008706
el muchach​o
Comfortably Numb
Posté le 11-07-2010 à 17:44:44  profilanswer
 

Pour l'instant, ça ne marche pas.
J'ai encore des blocages quand je le lance plusieurs fois d'affilée.
Apparemment, la javadoc indique pour remainingCapacity():
"Note that you cannot always tell if an attempt to add an element will succeed by inspecting remainingCapacity because it may be the case that a waiting consumer is ready to take an element out of an otherwise full queue. "

 

Mon code:

Code :
  1. import java.io.IOException;
  2. import java.util.concurrent.ArrayBlockingQueue;
  3. import java.util.concurrent.BlockingQueue;
  4. import java.util.concurrent.ExecutorService;
  5. import java.util.concurrent.Executors;
  6.  
  7. /**
  8. * Producer-Consumer in Java, for J2SE 1.5 using concurrent.
  9. */
  10. public class ProdCons {
  11.  
  12.     private static ExecutorService pool = Executors.newCachedThreadPool();
  13.     
  14.     static boolean killProducers = false;
  15.     static boolean killConsumers = false;
  16.     static int queueSize = 1000;
  17.     /**
  18.      * Launch nP producers and nC consumers
  19.      *
  20.      * @param nP
  21.      * @param nC
  22.      * @throws InterruptedException
  23.      */
  24.     ProdCons(int nP, int nC) throws InterruptedException {
  25.  
  26.         BlockingQueue<Long> fifo = new ArrayBlockingQueue<Long>(queueSize);
  27.  
  28.         for (int i = 0; i < nP; i++){
  29.             Producer p = new Producer(fifo, 0.1f);
  30.             pool.execute(p);
  31.         }
  32.         for (int i = 0; i < nC; i++){
  33.             Consumer c = new Consumer(fifo);
  34.             c.setDaemon(true);
  35.             pool.execute(c);
  36.         }
  37.  
  38.     }
  39.     
  40.     public static void main(String[] args) throws IOException,
  41.             InterruptedException {
  42.  
  43.         // Start producers and consumers
  44.         int numProducers = 1;
  45.         int maxConsumers = 4; // max number of consumers
  46.         ProdCons pc = new ProdCons(numProducers, maxConsumers);
  47.  
  48.         // Run for 5 seconds - shut down gracefully
  49.         Thread.sleep(2000);
  50.         pool.shutdown();
  51.         killProducers = true;
  52.         killConsumers = true;
  53.     }
  54. }
 
Code :
  1. import java.util.Random;
  2. import java.util.concurrent.BlockingQueue;
  3.  
  4. public class Producer implements Runnable {
  5.  
  6.     protected BlockingQueue<Long> queue;
  7.  
  8.     // Time interval between two polls of the database
  9.     protected int pollInterval;
  10.  
  11.     private Random generator = new Random();
  12.  
  13.     Producer(BlockingQueue<Long> theQueue, float pollInterval) {
  14.         this.queue = theQueue;
  15.         setPollInterval(pollInterval);
  16.     }
  17.  
  18.     public float getPollInterval() {
  19.         return (pollInterval / 1000);
  20.     }
  21.  
  22.     public void setPollInterval(float pollInterval) {
  23.         this.pollInterval = java.lang.Math.round(pollInterval * 1000f);
  24.     }
  25.  
  26.     public void run() {
  27.         try {
  28.             while (!ProdCons.killProducers) {
  29.                 Long[] justRead = requestDatabase();
  30.                 for (int i = 0; i < justRead.length; i++) {
  31.                     Long id = justRead[i];
  32.                     if (queue.remainingCapacity() > 0)
  33.                         queue.put(id);
  34.                 }
  35.                 System.out.println("Produced " + justRead.length
  36.                         + " object; List size now " + queue.size());
  37.  
  38.                 // wait before next read in database
  39.                 Thread.sleep(pollInterval);
  40.             }
  41.         } catch (InterruptedException ex) {
  42.         } finally {
  43.             System.out.println("PRODUCER INTERRUPTED" );
  44.             Thread.currentThread().interrupt();
  45.         }
  46.     }
  47.  
  48.     /**
  49.      * Simulation of reading from database
  50.      *
  51.      * @return
  52.      */
  53.     private Long[] requestDatabase() {
  54.         // simulate retrieval of id in DB
  55.         Long[] batch = new Long[generator.nextInt(1000)];
  56.         for (int i = 0; i < batch.length; i++) {
  57.             batch[i] = new Long(generator.nextInt());
  58.         }
  59.  
  60.         try {
  61.             Thread.sleep(100); // simulate time passed during query
  62.         } catch (InterruptedException ex) {
  63.             System.out.println("Producer Read INTERRUPTED" );
  64.         }
  65.         
  66.         return (batch);
  67.     }
  68.  
  69. }
 
Code :
  1. import java.util.concurrent.BlockingQueue;
  2.  
  3. public class Consumer extends Thread implements Runnable {
  4.     protected BlockingQueue<Long> queue;
  5.  
  6.     static long step;
  7.  
  8.     Consumer(BlockingQueue<Long> theQueue) {
  9.         this.queue = theQueue;
  10.     }
  11.  
  12.     public void run() {
  13.         try {
  14.             while (!ProdCons.killConsumers) {
  15.                 if(!queue.isEmpty()){
  16.                     Long id = queue.take();
  17.                     process(id);
  18.                     if (++step % 1000 == 0)
  19.                         System.out.println(step + " : FIFO size = " + queue.size());
  20.                 }
  21.             }
  22.         } catch (InterruptedException ex) {
  23.         } finally {
  24.             Thread.currentThread().interrupt();
  25.             System.out.println("CONSUMER INTERRUPTED" );
  26.         }
  27.     }
  28.  
  29.     void process(Long id) {
  30.         // Thread.sleep(xxx) // Simulate time passing
  31.          if (step % 10000 == 0)
  32.              System.out.println("Consuming id " + id);
  33.     }
  34. }

Message cité 1 fois
Message édité par el muchacho le 11-07-2010 à 19:54:43

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2008715
masklinn
í dag viðrar vel til loftárása
Posté le 11-07-2010 à 18:20:35  profilanswer
 

el muchacho a écrit :

Pour l'instant, ça ne marche pas.
J'ai encore des blocages quand je le lance plusieurs fois d'affilée.
Apparemment, la javadoc indique pour remainingCapacity():
"Note that you cannot always tell if an attempt to add an element will succeed by inspecting remainingCapacity because it may be the case that a waiting consumer is ready to take an element out of an otherwise full queue. "


Me semble parfaitement logique, tu devrais utiliser offer sur ton producer plutôt que put ici :o Et si tu veux mettre un death flag sur tes consumers, tu devrais de même utiliser poll et non take, imo.

 

J'ai pas encore fait tourner le code, juste lu rapidement, ce code suffit à exposer tes problèmes?

 

edit: heuu pourquoi tes consumers étendent Thread au fait? Et quel est l'intérêt d'une CachedThreadPool quand ton nombre de threads est statique et que tes threads sont tous longue durée?

 

edit2: et ExecutorService.shutdown ça sert à rien là, ça empêche juste de faire de nouveaux execute()/submit()/invoke* je pense

Message cité 1 fois
Message édité par masklinn le 11-07-2010 à 18:30:54

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2008716
el muchach​o
Comfortably Numb
Posté le 11-07-2010 à 18:28:49  profilanswer
 

masklinn a écrit :


Me semble parfaitement logique, tu devrais utiliser offer sur ton producer plutôt que put ici :o Et si tu veux mettre un death flag sur tes consumers, tu devrais de même utiliser poll et non take, imo.
 
J'ai pas encore fait tourner le code, juste lu rapidement, ce code suffit à exposer tes problèmes?
 
edit: heuu pourquoi tes consumers étendent Thread au fait?


Ouais, c'est tout le code. Tu le colles dans eclipse et ça roule (enfin si t'as rien d'autre à faire).
 
Normalement, ils étendent pas Thread, c'était juste pour faire un test avec setDaemon().


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2008718
masklinn
í dag viðrar vel til loftárása
Posté le 11-07-2010 à 18:31:18  profilanswer
 

el muchacho a écrit :


Ouais, c'est tout le code. Tu le colles dans eclipse et ça roule (enfin si t'as rien d'autre à faire).


OK. Voir edith aussi


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2008722
souk
Tourist
Posté le 11-07-2010 à 18:47:29  profilanswer
 

et du volatile sur les 2 booleens killProducers et killConsumers ca fera pas de mal, et pourquoi ils sont en static deja ? O_O

n°2008724
el muchach​o
Comfortably Numb
Posté le 11-07-2010 à 18:58:22  profilanswer
 

souk a écrit :

et du volatile sur les 2 booleens killProducers et killConsumers ca fera pas de mal, et pourquoi ils sont en static deja ? O_O


Ca ne change rien, d'ailleurs sur des booléens, ça ne change rien de toute façon.
edit: si le shutdown est nécessaire, sinon le pool reste en attente même quand tous les threads sont tués.

 

Par contre offer() et poll(), ça a l'air pas mal. J'avais pas vu, et j'ai bien l'impression que ça résoud le problème, par contre, je me retrouve avec des null à l'autre bout de la chaîne.

Message cité 2 fois
Message édité par el muchacho le 11-07-2010 à 19:12:27

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2008725
souk
Tourist
Posté le 11-07-2010 à 19:12:16  profilanswer
 

el muchacho a écrit :

Ca ne change rien, d'ailleurs sur des booléens, ça ne change rien de toute façon.


euh .... depuis quand ? [:pingouino]

n°2008726
masklinn
í dag viðrar vel til loftárása
Posté le 11-07-2010 à 19:15:35  profilanswer
 

el muchacho a écrit :


Ca ne change rien, d'ailleurs sur des booléens, ça ne change rien de toute façon.
edit: si le shutdown est nécessaire, sinon le pool reste en attente même quand tous les threads sont tués.
 
Par contre offer() et poll(), ça a l'air pas mal. J'avais pas vu, et j'ai bien l'impression que ça résoud le problème. :)


Voilà j'ai fixé ton problème en dégageant tout le code qui sert à rien et en utilisant la bonne méthode (shutdownNow):

Code :
  1. import java.io.IOException;
  2. import java.util.concurrent.*;
  3.  
  4. /**
  5. * Producer-Consumer in Java, for J2SE 1.5 using concurrent.
  6. */
  7. public class ProdCons {
  8.    private static ExecutorService pool = Executors.newFixedThreadPool(5);
  9.    static int queueSize = 1000;
  10.  
  11.    /**
  12.     * Launch nP producers and nC consumers
  13.     *
  14.     * @param nP
  15.     * @param nC
  16.     * @throws InterruptedException
  17.     */
  18.    ProdCons(int nP, int nC) throws InterruptedException {
  19.        BlockingQueue<Long> fifo = new ArrayBlockingQueue<Long>(queueSize);
  20.        for (int i = 0; i < nP; i++) {
  21.            Producer p = new Producer(fifo, 0.1f);
  22.            pool.execute(p);
  23.        }
  24.        for (int i = 0; i < nC; i++) {
  25.            Consumer c = new Consumer(fifo);
  26.            pool.execute(c);
  27.        }
  28.    }
  29.  
  30.    public static void main(String[] args) throws IOException,
  31.            InterruptedException {
  32.        // Start producers and consumers
  33.        int numProducers = 1;
  34.        int maxConsumers = 4; // max number of consumers
  35.        ProdCons pc = new ProdCons(numProducers, maxConsumers);
  36.        // Run for 5 seconds - shut down gracefully
  37.        Thread.sleep(5000);
  38.        System.out.println("SHUT DOWN EVERYTHING" );
  39.        pool.shutdownNow();
  40.        System.out.println("SHUTTING DOWN EVERYTHING" );
  41.        pool.awaitTermination(5, TimeUnit.DAYS);
  42.        System.out.println("MADAGASCAR IS SAFE AGAIN" );
  43.    }
  44. }


Code :
  1. import java.util.Random;
  2. import java.util.concurrent.BlockingQueue;
  3.  
  4. public class Producer implements Runnable {
  5.    protected BlockingQueue<Long> queue;
  6. // Time interval between two polls of the database
  7.    protected int pollInterval;
  8.    private Random generator = new Random();
  9.  
  10.    Producer(BlockingQueue<Long> theQueue, float pollInterval) {
  11.        this.queue = theQueue;
  12.        setPollInterval(pollInterval);
  13.    }
  14.  
  15.    public float getPollInterval() {
  16.        return (pollInterval / 1000);
  17.    }
  18.  
  19.    public void setPollInterval(float pollInterval) {
  20.        this.pollInterval = java.lang.Math.round(pollInterval * 1000f);
  21.    }
  22.  
  23.    public void run() {
  24.        try {
  25.            for (; ;) {
  26.                final Long[] justRead = requestDatabase();
  27.                for (final Long id : justRead) {
  28.                    queue.put(id);
  29.                }
  30.                System.out.println("Produced " + justRead.length
  31.                        + " object; List size now " + queue.size());
  32.                // wait before next read in database
  33.                Thread.sleep(pollInterval);
  34.            }
  35.        } catch (InterruptedException ex) {
  36.            System.out.println("Producer interruption" );
  37.        } finally {
  38.            System.out.println("PRODUCER DYING" );
  39.        }
  40.    }
  41.  
  42.    /**
  43.     * Simulation of reading from database
  44.     *
  45.     * @return
  46.     */
  47.    private Long[] requestDatabase() {
  48.        // simulate retrieval of id in DB
  49.        Long[] batch = new Long[generator.nextInt(1000)];
  50.        for (int i = 0; i < batch.length; i++) {
  51.            batch[i] = new Long(generator.nextInt());
  52.        }
  53.        try {
  54.            Thread.sleep(100); // simulate time passed during query
  55.        } catch (InterruptedException ex) {
  56.            System.out.println("Producer Read INTERRUPTED" );
  57.        }
  58.        return (batch);
  59.    }
  60. }


Code :
  1. import java.util.concurrent.BlockingQueue;
  2.  
  3. public class Consumer implements Runnable {
  4.    protected BlockingQueue<Long> queue;
  5.    static long step;
  6.  
  7.    Consumer(BlockingQueue<Long> theQueue) {
  8.        this.queue = theQueue;
  9.    }
  10.  
  11.    public void run() {
  12.        try {
  13.            for(;;) {
  14.                Long id = queue.take();
  15.                process(id);
  16.                if (++step % 1000 == 0)
  17.                    System.out.println(step + " : FIFO size = " + queue.size());
  18.            }
  19.        } catch (InterruptedException ex) {
  20.            System.out.println("Consumer interruption" );
  21.        } finally {
  22.            System.out.println("CONSUMER DYING" );
  23.        }
  24.    }
  25.  
  26.    void process(Long id) {
  27.        // Thread.sleep(xxx) // Simulate time passing
  28.        if (step % 10000 == 0)
  29.            System.out.println("Consuming id " + id);
  30.    }
  31. }


 

Consuming id 573391875
Consuming id 124395564
Consuming id 786122674
Consuming id 2129389787
Produced 737 object; List size now 0
Produced 6 object; List size now 4
1000 : FIFO size = 6
Produced 291 object; List size now 28
Produced 332 object; List size now 1
Produced 622 object; List size now 260
2000 : FIFO size = 0
Produced 410 object; List size now 278
Produced 160 object; List size now 37
Produced 332 object; List size now 42
3000 : FIFO size = 0
Produced 486 object; List size now 226
4000 : FIFO size = 94
Produced 741 object; List size now 23
Produced 670 object; List size now 369
Produced 671 object; List size now 653
5000 : FIFO size = 458
Produced 766 object; List size now 468
6000 : FIFO size = 224
7000 : FIFO size = 61
Produced 907 object; List size now 0
Produced 443 object; List size now 5
Produced 239 object; List size now 0
8000 : FIFO size = 0
Produced 421 object; List size now 231
Produced 244 object; List size now 2
Produced 183 object; List size now 182
Produced 147 object; List size now 147
9004 : FIFO size = 2
Produced 731 object; List size now 68
Produced 322 object; List size now 82
Produced 967 object; List size now 829
10000 : FIFO size = 822
Consuming id 516931685
11000 : FIFO size = 20
Produced 634 object; List size now 44
Produced 425 object; List size now 412
SHUT DOWN EVERYTHING
SHUTTING DOWN EVERYTHING
Producer interruption
PRODUCER DYING
Consumer interruption
CONSUMER DYING
Consumer interruption
CONSUMER DYING
Consumer interruption
CONSUMER DYING
Consumer interruption
CONSUMER DYING
MADAGASCAR IS SAFE AGAIN


 
'fin bon ça m'a quand même l'air plein de complications


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2008727
el muchach​o
Comfortably Numb
Posté le 11-07-2010 à 19:20:47  profilanswer
 

souk a écrit :


euh .... depuis quand ? [:pingouino]


J'avais lu qq part que les types dont la taille était inférieure à 1 word, dont les boolean, étaient de toute façon synchronisé. Et je me suis basé sur quelques tests, mais p-ê n'était-ce pas suffisant, je vais le remettre.
Mais le test avec offer/poll montre que le problème se situe bien à ce niveau.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2008728
masklinn
í dag viðrar vel til loftárása
Posté le 11-07-2010 à 19:38:17  profilanswer
 

el muchacho a écrit :


J'avais lu qq part que les types dont la taille était inférieure à 1 word, dont les boolean, étaient de toute façon synchronisé. Et je me suis basé sur quelques tests, mais p-ê n'était-ce pas suffisant, je vais le remettre.
Mais le test avec offer/poll montre que le problème se situe bien à ce niveau.


Tiens, j'ai enlevé plein de lignes, ça a l'air de marcher pas mal :o

Code :
  1. import java.io.IOException;
  2. import java.util.List;
  3. import java.util.concurrent.*;
  4.  
  5. /**
  6. * Producer-Consumer in Java, for J2SE 1.5 using concurrent.
  7. */
  8. public class ProdCons {
  9.    private static ExecutorService producer = Executors.newSingleThreadExecutor();
  10.    private static ExecutorService consumers = Executors.newFixedThreadPool(10);
  11.    
  12.    public static void main(String[] args) throws IOException,
  13.            InterruptedException {
  14.        // Start producers and consumers
  15.        Producer p = new Producer(consumers, 0.1f);
  16.        producer.execute(p);
  17.        
  18.        // Run for 5 seconds
  19.        Thread.sleep(5000);
  20.        System.out.println("SHUT DOWN EVERYTHING" );
  21.        producer.shutdownNow();
  22.        final List<Runnable> stillRunnable = consumers.shutdownNow();
  23.        System.out.println("SHUTTING DOWN EVERYTHING" );
  24.        consumers.awaitTermination(5, TimeUnit.DAYS);
  25.        System.out.println("MADAGASCAR IS SAFE AGAIN" );
  26.        System.out.println(String.format("%d tasks not run", stillRunnable.size()));
  27.    }
  28. }


Code :
  1. import java.util.Random;
  2. import java.util.concurrent.Executor;
  3.  
  4. public class Producer implements Runnable {
  5. // Time interval between two polls of the database
  6.    protected int pollInterval;
  7.    private Random generator = new Random();
  8.    private Executor consumers;
  9.  
  10.    Producer(Executor consumers, float pollInterval) {
  11.        this.consumers = consumers;
  12.        setPollInterval(pollInterval);
  13.    }
  14.  
  15.    public float getPollInterval() {
  16.        return (pollInterval / 1000);
  17.    }
  18.  
  19.    public void setPollInterval(float pollInterval) {
  20.        this.pollInterval = java.lang.Math.round(pollInterval * 1000f);
  21.    }
  22.  
  23.    public void run() {
  24.        try {
  25.            for (; ;) {
  26.                final long[] justRead = requestDatabase();
  27.                System.out.println("Producing " + justRead.length + " object" );
  28.                for (final long id : justRead) {
  29.                    consumers.execute(new Consumer(id));
  30.                }
  31.                // wait before next read in database
  32.                Thread.sleep(pollInterval);
  33.            }
  34.        } catch (InterruptedException ex) {
  35.            System.out.println("Producer interruption" );
  36.        } finally {
  37.            System.out.println("PRODUCER DYING" );
  38.        }
  39.    }
  40.  
  41.    /**
  42.     * Simulation of reading from database
  43.     *
  44.     * @return
  45.     */
  46.    private long[] requestDatabase() {
  47.        // simulate retrieval of id in DB
  48.        long[] batch = new long[generator.nextInt(1000)];
  49.        for (int i = 0; i < batch.length; i++) {
  50.            batch[i] = generator.nextLong();
  51.        }
  52.        try {
  53.            Thread.sleep(100); // simulate time passed during query
  54.        } catch (InterruptedException ex) {
  55.            System.out.println("Producer Read INTERRUPTED" );
  56.        }
  57.        return (batch);
  58.    }
  59. }


Code :
  1. public class Consumer implements Runnable {
  2.    static volatile long step = 0;
  3.    private long id;
  4.  
  5.    Consumer(long id) {
  6.        this.id = id;
  7.    }
  8.  
  9.    public void run() {
  10.        try {
  11.            process(id);
  12.            step++;
  13.        } catch (InterruptedException ex) {
  14.            System.out.println("Consumer interruption id " + id);
  15.            // cancel operation and requeue here
  16.        }
  17.    }
  18.  
  19.    void process(Long id) throws InterruptedException {
  20.        Thread.sleep(10);
  21.        if (step % 1000 == 0)
  22.            System.out.println("Consuming id " + id);
  23.    }
  24. }


La seule partie pas top, c'est que tu peux avoir pas mal de bronx dans tes consumers en fait (c'est unbounded) faudrait un Executor pouvant bloquer :o [:sadnoir]


Message édité par masklinn le 11-07-2010 à 19:41:37

---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2008729
souk
Tourist
Posté le 11-07-2010 à 19:42:52  profilanswer
 

el muchacho a écrit :

J'avais lu qq part que les types dont la taille était inférieure à 1 word, dont les boolean, étaient de toute façon synchronisé. Et je me suis basé sur quelques tests, mais p-ê n'était-ce pas suffisant, je vais le remettre.
Mais le test avec offer/poll montre que le problème se situe bien à ce niveau.


Le write est atomic puisque la taille est inferieure a un word, ok, mas sans le volatile, rien ne garantit que les changements sont visibles dans tous les threads, y a que volatile qui garantit ca (ou alors tu sors le canon AtomicBoolean [:dawa] )

n°2008730
el muchach​o
Comfortably Numb
Posté le 11-07-2010 à 19:43:34  profilanswer
 

masklinn a écrit :


Voilà j'ai fixé ton problème en dégageant tout le code qui sert à rien et en utilisant la bonne méthode (shutdownNow)


MADAGASCAR IS SAFE AGAIN
Ca marche ;)

 

J'avais pensé à mettre un ThreadPoolExecutor dans le producteur, ce qui fait n consommateurs par producteur. Du coup, il n'y avait plus de queue passée au constructeur et on pouvait espérer tuer les consommateurs au moment où on tuait le producteur.
Quelque chose dans ce goût là:

Code :
  1. import java.util.Collections;
  2. import java.util.HashSet;
  3. import java.util.Random;
  4. import java.util.Set;
  5. import java.util.concurrent.BlockingQueue;
  6. import java.util.concurrent.ExecutorService;
  7. import java.util.concurrent.LinkedBlockingQueue;
  8. import java.util.concurrent.ThreadPoolExecutor;
  9. import java.util.concurrent.TimeUnit;
  10.  
  11. public class Producer implements Runnable
  12. {
  13.         
  14.     // This set prevents that an id is inserted several times in the queue
  15.     // This supposes that the rate of insertion is comparable to the rate of removal,
  16.     // else the Set will grow up to memory exhaustion.
  17.     protected static Set<Long> idToTreat = Collections.synchronizedSet(new HashSet<Long>(1000));
  18.  
  19.     private final ExecutorService consumerPool;
  20.     
  21.     // Time interval between two polls of the database
  22.     private int pollInterval;
  23.     private Random generator = new Random();
  24.  
  25.     /**
  26.      * Create a Producer.
  27.      * Each producer has its own dedicated pool of consumers.
  28.      * @param consumerPool
  29.      * @param pollInterval
  30.      */
  31.     Producer(float pollInterval) {
  32.        //The numbers are just silly tune parameters. Refer to the API.
  33.        consumerPool = new ThreadPoolExecutor(1,5,30,TimeUnit.SECONDS,new LinkedBlockingQueue<Runnable>(100));
  34.         setPollInterval(pollInterval);
  35.     }
  36.  
  37.     public float getPollInterval() {
  38.         return (pollInterval / 1000);
  39.     }
  40.  
  41.     public void setPollInterval(float pollInterval) {
  42.         this.pollInterval = java.lang.Math.round(pollInterval * 1000f);
  43.     }
  44.  
  45.     public static Set<Long> getIdToTreat() {
  46.         return idToTreat;
  47.     }
  48.  
  49.     public static void setIdToTreat(Set<Long> idToTreat) {
  50.         Producer.idToTreat = idToTreat;
  51.     }
  52.  
  53.     public void run() {
  54.         try {
  55.             while (!Thread.interrupted()) {
  56.                 Long[] justRead = requestDatabase();
  57.                 for (int i = 0; i < justRead.length; i++) {
  58.                     Long id = justRead[i];
  59.                     consumerPool.submit(new Consumer(id));
  60.                 }
  61.                 
  62.                 // wait before next read in database
  63.                 Thread.sleep(pollInterval);
  64.             }
  65.         } catch (InterruptedException ex) {
  66.             Thread.currentThread().interrupt();
  67.             System.out.println("Producer INTERRUPTED" );
  68.         }
  69.     }
  70.  
  71.     /**
  72.      * Simulation of reading from database
  73.      * @return
  74.      */
  75.     private Long[] requestDatabase() {
  76.  
  77.         // simulate reading of id in DB
  78.         Long[] batch = new Long[generator.nextInt(100)];
  79.         for (int i = 0; i < batch.length; i++) {
  80.             batch[i] = new Long(generator.nextInt());
  81.         }
  82.  
  83.         try {
  84.             Thread.sleep(100); // simulate time passing during read
  85.         } catch (InterruptedException ex) {
  86.             System.out.println("Producer Read INTERRUPTED" );
  87.         }
  88.         return (batch);
  89.     }
  90.     
  91. }


Le gros avantage est que le Consumer est alors réduit à sa plus simple expression.

Code :
  1. public class Consumer implements Runnable {
  2.      static volatile long step = 0;
  3.      private long id;
  4.  
  5.     Consumer(long id) { this.id = id; }
  6.    
  7.       public void run() {
  8.             process(id);
  9.             if (++step % 1000 == 0)
  10.                   System.out.println(step + " : FIFO size = " + queue.size());
  11.       }
  12.    
  13.       void process(Long id) {
  14.           // Thread.sleep(xxx) // Simulate time passing
  15.           if (step % 10000 == 0)
  16.               System.out.println("Consuming id " + id);
  17.       }
  18.    }
 

Mais ce système est pas mal lorsque le producer produit des données en streaming, au coup par coup. Dans mon cas, je crée trop de Consumers d'un coup (la requête de la base pouvant potentiellement retourner des milliers d'id), c'est pas adapté.


Message édité par el muchacho le 11-07-2010 à 20:01:02

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2008731
el muchach​o
Comfortably Numb
Posté le 11-07-2010 à 19:50:44  profilanswer
 

Ah ben je vois que tu m'as grillé. Mais je suis revenu sur la solution initiale pour la raison évoquée ci-dessus.

Message cité 1 fois
Message édité par el muchacho le 11-07-2010 à 19:52:13

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2008735
masklinn
í dag viðrar vel til loftárása
Posté le 11-07-2010 à 20:22:13  profilanswer
 

el muchacho a écrit :

Ah ben je vois que tu m'as grillé. Mais je suis revenu sur la solution initiale pour la raison évoquée ci-dessus.


Lis la fin du post :o


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2008740
masklinn
í dag viðrar vel til loftárása
Posté le 11-07-2010 à 20:45:20  profilanswer
 

'finbon dans tous les cas t'as aucune raison d'utiliser autre chose qu'une thread pool a taille fixe :o


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2008785
el muchach​o
Comfortably Numb
Posté le 12-07-2010 à 06:10:16  profilanswer
 

masklinn a écrit :


Lis la fin du post :o


J'avais lu. Ca n'empêche pas que je fais des milliers de new Consumer(id) inutiles, même si seulement quelques-uns sont enfilés. [:spamafote]


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2008787
masklinn
í dag viðrar vel til loftárása
Posté le 12-07-2010 à 06:48:21  profilanswer
 

el muchacho a écrit :


J'avais lu. Ca n'empêche pas que je fais des milliers de new Consumer(id) inutiles, même si seulement quelques-uns sont enfilés. [:spamafote]


Bah non justement [:petrus75]


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box by throwing away the limits imposed by overbearing genetic regulations? Isn't that a good thing?
n°2008917
DaMehdi
Posté le 12-07-2010 à 23:49:17  profilanswer
 

Sinon qu'est ce que vous utilisez comme parseur XML ?  
Je dois créer un fichier XMl à partir d'un .doc,j'ai déja extrait les infos du doc et je les ai stockées dans les structures adéquates mais je cherche un bon parseur pour créer mon ficheir XML.
J'ai vu qu'il y'avait JDOM,Xerces,XOM... et je ne sais pas lequel choisir.
Si les pros pouvais me donner un conseil,merci.

n°2008960
boulax
Inserer phrase hype en anglais
Posté le 13-07-2010 à 11:09:10  profilanswer
 

T'as regardé XStream ?


---------------
Posté depuis des chiottes, sales. Me gusta.
n°2009005
DaMehdi
Posté le 13-07-2010 à 15:01:19  profilanswer
 

Finalement j'ai commencé avec XOM ( très simple et assez efficace pour ceux que ça intéresse),je vais quand même jeter un coup d’œil sur XStream,merci pour la réponse.
Voici un lien pour tous les parseurs XML,si ça peut aider quelqu'un :
 
http://java-source.net/open-source/xml-parsers

n°2009084
Siluro
Posté le 14-07-2010 à 00:18:12  profilanswer
 

T'avais aussi XPP3 si tu voulais un truc simple, rapide (et à l'arrache) :o
 [:michrone]

n°2009093
el muchach​o
Comfortably Numb
Posté le 14-07-2010 à 09:20:30  profilanswer
 

Ouais, XStream est basé sur XPP3 par défaut. Donc avec XStream, tu fais de la sérialisation/désérialisation, et comme il y a la lib XPP3 incluse (un XML pull parser  très rapide), tu peux faire aussi du DOM facilement.


Message édité par el muchacho le 14-07-2010 à 09:26:26

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
n°2009170
DaMehdi
Posté le 14-07-2010 à 17:19:14  profilanswer
 

XOM supporte aussi la sérialisation il très bon,je le conseille à tous les débutants en XML.

n°2009857
oxman
xiii
Posté le 19-07-2010 à 00:56:40  profilanswer
 

J'ai vu que ça parlait un petit peu de Scala ici.
Vous en pensez quoi par contre ?
Je n'ai vu peu d'avis, moi par exemple qui cherchait un langage du type script à typage fort mais pas non plus un truc exotique, je trouve le Scala très intéressant car 100% compatible Java.

n°2010148
the real m​oins moins
Posté le 19-07-2010 à 17:56:00  profilanswer
 

question à 2 sous:
cfr. https://freemarker.svn.sourceforge. [...] gUtil.java
 
Qqun peut-il m'expliquer le but de la duplication de code qu'on trouve dans la methode XMLEncNA(String s) ? Je rêve ou c'est juste pour éviter de créer le StringBuilder si s ne contient aucun des charactères qu'on veut encoder ? Si c'est ça.. bon, soit, je veux bien; mais on aurait pu extraire le if et l'append dans une methode non ? Le JIT aurait optimisé ça au moins aussi bien non ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°2010154
0x90
Posté le 19-07-2010 à 18:12:44  profilanswer
 

the real moins moins a écrit :

question à 2 sous:
cfr. https://freemarker.svn.sourceforge. [...] gUtil.java

 

Qqun peut-il m'expliquer le but de la duplication de code qu'on trouve dans la methode XMLEncNA(String s) ? Je rêve ou c'est juste pour éviter de créer le StringBuilder si s ne contient aucun des charactères qu'on veut encoder ? Si c'est ça.. bon, soit, je veux bien; mais on aurait pu extraire le if et l'append dans une methode non ? Le JIT aurait optimisé ça au moins aussi bien non ?

 

Je crois bien ouais [:spamafote]

 

Cela dit pour éviter la duplication je serais plutôt parti sur :

Code :
  1. public static String XMLEncNA(String s) {
  2.    int ln = s.length();
  3.    for (int i = 0; i < ln; i++) {
  4.        char c = s.charAt(i);
  5.        if (c == '<' || c == '>' || c == '&' || c == '"') {
  6.            int next = 0;
  7.            StringBuilder b = new StringBuilder();
  8.            while (i < ln) {
  9.                c = s.charAt(i);
  10.                if (c == '<' || c == '>' || c == '&' || c == '"') {
  11.                    b.append(s.substring(next, i));
  12.                    switch (c) {
  13.                        case '<': b.append("&lt;" ); break;
  14.                        case '>': b.append("&gt;" ); break;
  15.                        case '&': b.append("&amp;" ); break;
  16.                        case '"': b.append("&quot;" ); break;
  17.                    }
  18.                    next = i + 1;
  19.                }
  20.                i++;
  21.            }
  22.            if (next < ln) b.append(s.substring(next));
  23.            s = b.toString();
  24.            break;
  25.        } // if c ==
  26.    } // for
  27.    return s;
  28. }


Y'a un test redondant à la première itération du while mais le compilo devrait être capable de le voir, après c'est à lui de décider s'il vaut mieux unroller cette itération ou pas...


Message édité par 0x90 le 19-07-2010 à 18:13:10

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°2010161
the real m​oins moins
Posté le 19-07-2010 à 18:44:06  profilanswer
 

[:romf]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°2010166
the real m​oins moins
Posté le 19-07-2010 à 19:06:39  profilanswer
 

y'a du monde qui utilise Nexus ici ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  271  272  273  ..  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)