确定打印机是否可以在不查找的情况下处理打印作业
我一直在打击PrintServiceLookup
; lookupPrintServices(DocFlavor flavor, AttributeSet attributes)
方法过于缓慢以至于在我们的应用程序中使用初始的运行检测打印机。 具有超过100台networking打印机的客户报告说,执行此代码的行为在第一次运行时performance不佳。
看到查找结果被caching后,我最初在一个单独的线程(在启动时执行)中部署了一个虚拟查询。 但是,对于特定的客户端,此解决scheme无法正常工作。
我目前没有他们的环境,不能看到是什么导致了确切的性能问题。
我试图看看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声明当使用null DocFlavor
和AttributeSet
调用isAttributeValueSupported(Attribute attrval,DocFlavor flavor,AttributeSet attributes)
这个方法告诉这个打印服务是否支持给定的打印属性值的一些可能的doc风格和属性组合
到目前为止行为正确。 但是,我不完全确定如果这是打印机支持所选页面大小的方式。
感谢您对此问题的反馈和经验。
更新
在我实施我的方法的时候,我的工作站决定有严重的networking问题,这让我花了一段时间才弄清楚。 最后,我的实现已经使用networking工具SoftPerfect Connection Emulator (模拟networking负载)进行了testing,结果没有显着改善。
我将继续testing并更新这个问题。 希望我能find一个解决scheme,并与这里的人分享。 我猜测,最初的查询:
private static final PrintService[] PRINTSERVICES = PrintServiceLookup.lookupPrintServices(null, null);
仍然是造成问题。
更新2
testing版最终在客户端环境下testing,打印对话框的性能提高了大约5倍(在相同环境下,打印机的初始拉动大约需要1分钟,而大约5分钟)。 尽pipe如此,最初的等待时间还不是一个可以接受的时间,但是,现在是我能做的最好的。 我们也从客户那里听说,正在使用一台打印服务器,并按照评论中的build议(@Wardy),我将朝着这个方向前进。 希望我们能利用打印服务器的优势。
更积极的caching。 让客户端执行一次查找并在重新启动之间保持caching。 更好的是,将caching保存到所有客户端可以访问的中央数据存储区。
我假设networking打印机及其function不会经常更改,但最终必须更新caching,但是“谁”和“何时”取决于您的环境。
对caching的更新可以由在后台运行当前发现的客户端进行,并且如果检测到更改,则会更新caching。 如果你有一个连续运行的中心组件,那将是一个你可以固定间隔检查的好地方。
如果您拥有某种目录服务,则可以在联系每台打印机之前,将其打印机列表与caching进行比较,然后再联系每台打印机以获得减lessnetworking和CPU负载的function。
如果打印机列表存储在LDAP中,则可以尝试使用LDAP查找打印机。