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ą MediaSizeName
bez 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.
można zrobić rzeczywisty wyszukiwanie w osobnym wątku na starcie? – eabraham
@eabraham, jak już wspomniałem, podczas uruchamiania wykonywany jest fałszywy lookup. Wszystkie późniejsze wyszukiwania zależą od danych wprowadzanych przez użytkownika. – arin
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. –