2012-04-04 9 views
65

Ho combattuto il PrintServiceLookup; il metodo lookupPrintServices(DocFlavor flavor, AttributeSet attributes) è troppo lento per rilevare le stampanti nella nostra applicazione con il run-in iniziale. I client con più di 100 stampanti di rete hanno segnalato che il comportamento che esegue questo codice si comporta male la prima volta che viene eseguito.Determinare se una stampante può gestire un lavoro di stampa senza look

Dopo aver visto che i risultati della ricerca sono stati memorizzati nella cache, ho inizialmente distribuito una ricerca fittizia all'interno di un thread separato (eseguito all'avvio). Tuttavia, per un particolare cliente questa soluzione non funziona.

Attualmente non ho il loro ambiente e non riesco a vedere cosa sta causando l'esatto problema di prestazioni.

Sto cercando di vedere se un PrintService supporta un dato MediaSizeNamesenza l'esecuzione di un look-up di DocFlavor e AttributeSet. Così ho tirare tutti PrintService s disponibili e il default PrintService:

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

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

E poi, ottenere il PrintService e il MediaSizeName dalla richiesta del client. Infine, chiedo al PrintService se il MediaSizeName è supportata da:

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."); 
    } 

Il API dichiara che quando isAttributeValueSupported(Attribute attrval,DocFlavor flavor,AttributeSet attributes) si chiama con null DocFlavor e AttributeSet

questo metodo indica se questo servizio di stampa supporta la stampa data valore attributo per alcune possibili combinazioni di sapore doc e set di attributi

e ha s si è comportato correttamente fino ad ora. Tuttavia, non sono del tutto sicuro se questo è il modo di eseguire se una stampante supporta una dimensione di pagina selezionata.

Apprezzerei il vostro feedback ed esperienza su questo problema.


Aggiornamento

Intorno al periodo ho implementato il mio approccio, la mia postazione di lavoro ha deciso di avere seri problemi di rete, che mi ha portato un po 'per capire. Infine, la mia implementazione è stata testata con lo strumento di rete SoftPerfect Connection Emulator (per simulare il carico di rete) ei risultati non sono migliorati in modo significativo.

Continuerò a testare e aggiornare questa domanda. Spero di trovare una soluzione e condividerla con le persone qui. Sto indovinando che la ricerca iniziale:

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

causa ancora problemi.


Update 2

La beta build è finalmente testato su l'ambiente client e le prestazioni della finestra di stampa è di circa 5 volte migliorati (l'attrazione iniziale della stampante ora richiede circa 1 minuto sotto lo stesso ambiente rispetto a circa 5 minuti). Ancora il tempo di attesa iniziale non è una quantità accettabile di tempo, tuttavia, è il meglio che potrei fare per ora. Abbiamo anche sentito dal client che si sta utilizzando un server di stampa e seguendo i suggerimenti nei commenti (@Wardy), andrò avanti in questa direzione. Speriamo di poter sfruttare i vantaggi del server di stampa.

+3

È possibile eseguire la ricerca effettiva in un thread separato all'avvio? – eabraham

+2

@eabraham come accennato c'è una ricerca fittizia eseguita all'avvio. Tutte le ricerche successive eseguite dipendono dall'input dell'utente. – arin

+8

Hai profilato di vedere dove viene speso il tempo? La mia ipotesi è che venga speso un sacco di tempo per la ricerca di nomi host di vario tipo combinata con una cattiva voce del server DNS. –

risposta

0

Se l'elenco delle stampanti è memorizzato in LDAP, è possibile provare a cercare stampanti utilizzando LDAP.

2

Caching più aggressivo. Chiedere al client di eseguire la ricerca una volta e mantenere la cache tra riavvii. Meglio ancora, salva la cache in un archivio dati centrale accessibile da tutti i client.

Suppongo che le stampanti di rete e le relative funzionalità non cambino spesso ma è necessario aggiornare la cache, ma "chi" e "quando" dipendono dal proprio ambiente.

Gli aggiornamenti alla cache possono essere eseguiti da un client che esegue la scoperta corrente in background e se vengono rilevate modifiche aggiorna la cache. Se si dispone di un componente centrale che funziona continuamente in ogni caso, sarebbe un buon posto dove è possibile controllare a intervalli fissi.

Se si dispone di un tipo di servizio di directory, è possibile confrontare l'elenco di stampanti con la cache prima di contattare ciascuna stampante per ottenere le sue capacità per ridurre la rete e il carico della CPU.

+0

Non sono sicuro che la memorizzazione nella cache aggressiva di MediaSizeName sia possibile a causa di http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6278300 – nevets1219

Problemi correlati