2012-04-04 15 views
65

Walczyłem z PrintServiceLookup; Metoda lookupPrintServices(DocFlavor flavor, AttributeSet attributes) jest zbyt powolna, aby wykryć drukarki w naszej aplikacji przy pierwszym uruchomieniu. Klienci posiadający ponad 100 drukarek sieciowych zgłosili, że zachowanie, które wykonuje ten kod, jest słabo wykonywane przy pierwszym uruchomieniu.Określanie, czy drukarka może obsłużyć zlecenie drukowania bez wyszukiwania

Po stwierdzeniu, że wyniki wyszukiwania są buforowane, początkowo zastosowałem fałszywe wyszukiwanie w oddzielnym wątku (wykonywane podczas uruchamiania). Jednak dla konkretnego klienta to rozwiązanie nie działa.

Nie mam obecnie środowiska i nie widzę powodu, dla którego występuje problem z wydajnością.

Próbuję sprawdzić, czy PrintService obsługuje daną MediaSizeNamebez wykonywania przeglądowej DocFlavor i AttributeSet. Więc wyciągnąć wszystkie dostępne PrintService S i domyślne PrintService:

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

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

A potem, uzyskaj PrintService i MediaSizeName z żądania klienta. Wreszcie pytam PrintService jeśli MediaSizeName jest wspierany przez:

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

API deklaruje, że gdy isAttributeValueSupported(Attribute attrval,DocFlavor flavor,AttributeSet attributes) nazywa NULL DocFlavor i AttributeSet

metoda ta informuje, czy ta usługa druku obsługuje daną drukowanie wartość atrybutu dla pewnej możliwej kombinacji smaku dokumentu i zestawu atrybutów

i ha s zachowywał się poprawnie do tej pory. Jednak nie jestem do końca pewien, czy jest to sposób wykonania, jeśli drukarka obsługuje wybrany rozmiar strony.

Będę wdzięczny za opinię i doświadczenie w tej kwestii.


Aktualizacja

Mniej więcej w czasie I wdrożone moje podejście, moje stanowisko pracy postanowił mieć poważne problemy z siecią, co zajęło mi trochę czasu, aby dowiedzieć się. Ostatecznie moja implementacja została przetestowana za pomocą narzędzia sieciowego SoftPerfect Connection Emulator (symulującego obciążenie sieci), a wyniki nie uległy znacznej poprawie.

Będę kontynuować testowanie i aktualizować to pytanie. Mam nadzieję, że uda mi się znaleźć rozwiązanie i podzielić się nim z innymi tutaj. Zgaduję, że początkowe wyszukiwanie:

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

nadal powoduje problemy.


Aktualizacja 2

beta build wreszcie testowane w środowisku klienta i wydajności w oknie dialogowym drukowania jest około 5 razy lepsze (początkowe przyciąganie drukarki trwa teraz około 1 minuty pod tym samym środowisko w porównaniu do około 5 minut). Mimo to początkowy czas oczekiwania nie jest dopuszczalnym czasem, jednak jest to najlepsze, co mogę zrobić na razie. Usłyszeliśmy też od klienta, że ​​serwer druku jest używany i postępując zgodnie z sugestiami zawartymi w komentarzach (@Wardy), będę poruszał się w tym kierunku. Mamy nadzieję, że możemy wykorzystać zalety serwera druku.

+3

można zrobić rzeczywisty wyszukiwanie w osobnym wątku na starcie? – eabraham

+2

@eabraham, jak już wspomniałem, podczas uruchamiania wykonywany jest fałszywy lookup. Wszystkie późniejsze wyszukiwania zależą od danych wprowadzanych przez użytkownika. – arin

+8

Czy profilowane, aby zobaczyć, gdzie spędza się czas? Domyślam się, że wiele czasu spędza się na wyszukiwaniu nazw hostów różnych typów w połączeniu ze złym wpisem serwera DNS. –

Odpowiedz

0

Jeśli lista drukarek są przechowywane w katalogu LDAP, można spróbować do wyszukiwania drukarek przy użyciu LDAP.

2

Bardziej agresywne buforowanie. Poproś klienta, aby raz wykonał wyszukiwanie i zachował pamięć podręczną między ponownymi uruchomieniami. Co więcej, należy zapisać pamięć podręczną w centralnym magazynie danych dostępnym dla wszystkich klientów.

Zakładam, że drukarki sieciowe i ich możliwości nie zmieniają się tak często, ale trzeba w końcu zaktualizować pamięć podręczną, ale "kto" i "kiedy" jest zależne od środowiska.

Aktualizacje pamięci podręcznej mogą być wykonane przez klienta, który prowadzi bieżącą odkrycie w tle i jeśli zostaną wykryte zmiany aktualizuje cache. Jeśli masz centralny komponent, który działa nieprzerwanie w każdym razie, byłoby to dobre miejsce, w którym możesz sprawdzić stałe interwały.

Jeśli masz jakieś usługi katalogowej można porównać swoją listę drukarek z buforować przed skontaktowaniem się z każdą drukarkę, aby uzyskać jego możliwości, aby zmniejszyć obciążenie sieci i procesora.

+0

Nie jestem pewien, czy agresywne buforowanie MediaSizeName jest możliwe z powodu http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6278300 – nevets1219

Powiązane problemy