Определение того, может ли принтер обрабатывать задание печати без поиска

Я сражался с 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), я буду двигаться в этом направлении. Надеюсь, мы сможем использовать преимущества сервера печати. ​​

Ответ 1

Более агрессивное кэширование. Попросите клиента выполнить поиск один раз и сохранить кеш между перезагрузками. Еще лучше сохраните кеш в центральном хранилище данных, доступном для всех клиентов.

Я предполагаю, что сетевые принтеры и их возможности часто не меняются, но вы должны в конечном итоге обновить кеш, но "кто" и "когда" зависит от вашей среды.

Обновления кэш-памяти могут быть сделаны клиентом, который запускает ваше текущее обнаружение в фоновом режиме, и если обнаружены изменения, обновляет кеш. Если у вас есть центральный компонент, который работает непрерывно в любом случае, это будет хорошее место, где вы можете проверять фиксированные интервалы.

Если у вас есть служба каталогов, вы можете сравнить свой список принтеров с кешем, прежде чем обращаться к каждому принтеру, чтобы получить возможность уменьшить нагрузку на сеть и процессор.

Ответ 2

Если список принтеров хранится в LDAP, вы можете попробовать искать принтеры, используя LDAP.