Question

J'ai une application écrite en java qui doit trouver tous les hôtes accessibles sur le réseau.

J'utilise InetAddress.isReachable() de le faire avec un délai d'attente de 2000 millisecondes.

Je regarde l'adresse IP de la machine locale actuelle et sur la base que je tente d'atteindre les autres adresses IP fin 1 -. 255 manquants sur les machines locales l'adresse IP

Tout fonctionne très bien seul thread, juste prend beaucoup de temps que la plupart des adresses IP ne sont pas accessibles car ils n'utilisent pas le existent pour délai de 2 secondes.

Pour accélérer les choses (et essayer dans l'action :: concurrency Brian Goetz) i essayé d'utiliser Future et Callable etc.

Tout cela allait bien aussi.

Cependant, je figurais en utilisant ExecutorCompletionService pour donner mes utilisateurs une application plus réactive, afin qu'ils puissent voir les résultats comme ils sont disponibles à l'aide

Future<Reach> reachedFuture = completionService.take();

L'exécution de ce sur une machine à singleprocessor les causes suivantes config seulement 1 des quatre hôtes accessibles à identifier:

private static final int poolSize = 10;
private static final int maxPoolSize = 10;
private static final long keepAliveTime = 120;

private static final LinkedBlockingQueue<Runnable> queue
        = new LinkedBlockingQueue<Runnable>(20);

private static final ExecutorService executorService
        = new ThreadPoolExecutor(poolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, queue);

private static final CompletionService<Reach> completionService
        = new ExecutorCompletionService<Reach>(executorService);

Changement à cela sur une machine quad core a également fait ne parviennent pas à détecter tous les hôtes accessibles:

private static final int poolSize
        = Math.max(2,Runtime.getRuntime().availableProcessors());

private static final int maxPoolSize
        = Math.max(2,Runtime.getRuntime().availableProcessors());

En modifiant le délai de InetAddress.isReachable() à 10 secondes a fait la dernière ok de travail de configuration.

De plus en changeant la configuration de la façon suivante sur la machine quad core également fonctionner avec un 2 deuxième temps d'arrêt:

private static final int poolSize = 2;
private static final int maxPoolSize = 2;

Suis-je manque quelque chose de très évident pourquoi cela se produit?

Ce qui empêche InetAddress.isReachable(2000) de détecter tous les hôtes accessibles sur mon réseau?

Pourquoi ne tentez d'exécuter plusieurs appels InetAddress.isReachable() échouent?

Était-ce utile?

La solution

J'ai donc écrit un petit script de test sur mon Mac et je ne peux pas le faire échouer - quelle que soit la taille de la piscine. Je ne change la LinkedBlockingQueue être illimitée sinon je ne pouvais pas présenter tous les emplois. En outre, après un certain temps la méthode isReachable() a été de lancer une ConnectException si je devais gérer cela spécifiquement. Est-ce le problème avec votre code @ user423199?

Voici le code:

  

http://pastie.org/2460991

Je me demande quel système d'exploitation que vous exécutez ce sur? Certaines piles IP ne peuvent pas comme plusieurs threads faisant des paquets ICMP dans le même processus. J'aurais pensé que tous les systèmes d'exploitation modernes seraient intelligents à ce sujet, mais cela peut être un problème potentiel. Il peut également être un bug entre Java JRE et la pile d'OS.

Hope this helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top