Я сражался с PrintServiceLookup
; метод lookupPrintServices(DocFlavor flavor, AttributeSet attributes)
слишком медленный, чтобы обнаруживать принтеры в нашем приложении с первоначальным запуском. Клиенты с более чем 100 сетевыми принтерами сообщили, что поведение, выполняющее этот код, плохо выполняется при первом запуске.
Увидев, что результаты поиска кэшируются, я изначально развернул фиктивный поиск в отдельном потоке (выполняется при запуске). Однако для конкретного клиента это решение не работает.
В настоящее время у меня нет своей среды и не вижу, что вызывает точную проблему с производительностью.
Я пытаюсь увидеть, поддерживает ли PrintService
заданный MediaSizeName
без просмотр DocFlavor
и AttributeSet
. Поэтому я вытаскиваю все доступные PrintService
и по умолчанию PrintService
:
private static final PrintService[] PRINTSERVICES =
PrintServiceLookup.lookupPrintServices(null, null);
private static final PrintService DEFAULTSERVICE =
PrintServiceLookup.lookupDefaultPrintService();
И затем, получите PrintService
и MediaSizeName
из запроса клиента. Наконец, я спрашиваю PrintService
, если MediaSizeName
поддерживается:
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 заявляет, что при вызове isAttributeValueSupported(Attribute attrval,DocFlavor flavor,AttributeSet attributes)
с нулем DocFlavor
и AttributeSet
этот метод сообщает, поддерживает ли эта служба печати заданное значение атрибута печати для некоторой возможной комбинации аромата doc и набора атрибутов
и вел себя правильно до сих пор. Тем не менее, я не совсем уверен, что это способ выполнить, если принтер поддерживает выбранный размер страницы.
Буду признателен за ваши отзывы и опыт по этой проблеме.
Обновление
Примерно в то время, когда я реализовал свой подход, моя рабочая станция решила иметь серьезные проблемы с сетью, и мне потребовалось некоторое время, чтобы понять. Наконец, моя реализация была протестирована с помощью сетевого инструмента SoftPerfect Connection Emulator (для имитации сетевой нагрузки), и результаты значительно не улучшились.
Я продолжу тестирование и обновление этого вопроса. Надеюсь, я смогу найти решение и поделиться им с людьми здесь. Я предполагаю, что первоначальный поиск:
private static final PrintService[] PRINTSERVICES =
PrintServiceLookup.lookupPrintServices(null, null);
все еще вызывает проблемы.
Обновление 2
Бета-версия, наконец, протестирована в клиентской среде, и производительность диалогового окна печати примерно в 5 раз улучшилась (первоначальное притяжение принтера теперь занимает около 1 минуты в той же среде по сравнению с примерно 5 минутами). Однако начальное время ожидания не является приемлемым временем, однако, это лучшее, что я мог бы сделать сейчас. Мы также слышали от клиента, что сервер печати используется и после предложений в комментариях (@Wardy), я буду двигаться в этом направлении. Надеюсь, мы сможем использовать преимущества сервера печати.