65 votes

Déterminer si une imprimante peut gérer un travail d'impression sans look-up

J'ai été aux prises avec l' PrintServiceLookup; lookupPrintServices(DocFlavor flavor, AttributeSet attributes) méthode est trop lente pour détecter les imprimantes dans notre application avec la course initiale. Les Clients avec plus de 100 imprimantes réseau ont rapporté que les comportements qui s'exécute ce code est mal effectuer la première fois qu'il est exécuté.

Après avoir vu que la recherche de résultats sont mis en cache, j'ai d'abord déployé un mannequin de recherche dans un thread séparé (exécuté au démarrage). Cependant, pour un client particulier, cette solution n'est pas de travail.

Je ne suis pas actuellement ont de leur environnement et ne peut pas voir ce qui est à l'origine de la performance exacte du problème.

Je suis en train de voir si un PrintService prend en charge une MediaSizeName sans effectuer une de la DocFlavor et AttributeSet. Donc je tire de tout disponible PrintServices et la valeur par défaut PrintService:

private static final PrintService[] PRINTSERVICES = 
   PrintServiceLookup.lookupPrintServices(null, null);

private static final PrintService DEFAULTSERVICE = 
   PrintServiceLookup.lookupDefaultPrintService();

Et ensuite, obtenir le PrintService et de la MediaSizeName de la demande du client. Enfin, je demande à l' PrintService si l' MediaSizeName est pris en charge par:

private void checkPrintServiceForMediaSize(PrintService pservice) throws MediaSizeNotSupportedException{
     if(!pservice.isAttributeValueSupported(_mediaSizeName,null,null))
            throw new MediaSizeNotSupportedException("This media size is not supported by the selected printer.");
     }

L' API déclare que lorsqu' isAttributeValueSupported(Attribute attrval,DocFlavor flavor,AttributeSet attributes) est appelée avec la valeur null DocFlavor et AttributeSet

cette méthode indique si ce Service d'Impression prend en charge les donné l'impression de la valeur de l'attribut pour certaines combinaisons possibles de doc saveur et un ensemble d'attributs

et s'est comporté correctement jusqu'à maintenant. Cependant, je ne suis pas entièrement sûr si c'est la voie à suivre si une imprimante prend en charge une taille de page sélectionnée.

Je vous serais reconnaissant de vos commentaires et de votre expérience sur cette question.


Mise à jour

Autour du temps j'ai mis en place mon approche, mon poste de travail a décidé d'avoir de graves problèmes de réseau, ce qui m'a pris un certain temps à comprendre. Enfin, mon œuvre a été testé avec l'outil de réseautage SoftPerfect Connexion Émulateur (pour simuler la charge réseau) et les résultats ne se sont pas améliorées de façon significative.

Je vais continuer à tester et à mettre à jour cette question. J'espère pouvoir trouver une solution et de le partager avec des gens d'ici. Je suppose que l'initiale de recherche:

private static final PrintService[] PRINTSERVICES = 
   PrintServiceLookup.lookupPrintServices(null, null);

est encore à l'origine de problèmes.


Mise à jour 2

La beta build est enfin testé dans l'environnement client et la performance de la boîte de dialogue d'impression est d'environ 5 fois améliorée (l'attraction initiale de l'imprimante en maintenant faut environ 1 minute sous le même environnement, comparativement à environ 5 minutes). Encore la période d'attente initiale n'est pas une quantité acceptable de temps, cependant, est le mieux que je puisse faire pour l'instant. Nous avons également entendu de la part du client d'un serveur d'impression est utilisé et en suivant les suggestions dans les commentaires (@Wardy), je vais être en mouvement dans cette direction. Heureusement, nous pouvons tirer parti des avantages de la fonction de serveur d'impression.

2voto

Darcara Points 1110

Plus agressif, la mise en cache. Le client d'effectuer le look-up une fois et à la persistance de la mémoire cache entre les redémarrages. Mieux encore, enregistrer le cache dans une banque de données centrale, qui est accessible par tous les clients.

Je suis en supposant que les imprimantes réseau et leurs capacités ne change pas souvent, mais vous devez mettre à jour le cache, mais finalement le "qui" et "quand" dépend de votre environnement.

Les mises à jour du cache peut être faite par un client qui exécute votre découverte en cours en arrière-plan et si des modifications sont détectées met à jour le cache. Si vous avez un composant central qui fonctionne en permanence de toute façon, ce serait un bon endroit où vous pouvez vérifier à intervalles fixes.

Si vous avez une sorte de service d'annuaire, vous pouvez comparer la liste des imprimantes avec vous cache avant de communiquer avec chaque imprimante pour accéder à ses capacités de réseau et de réduire la charge du processeur.

0voto

kos32 Points 15

Si la liste des imprimantes est stocké dans LDAP, vous pouvez essayer de rechercher des imprimantes à l'aide de LDAP.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X