我一直在与PrintServiceLookup
; 该lookupPrintServices(DocFlavor flavor, AttributeSet attributes)
方法在初始运行时检测我们的应用程序中的打印机非常慢。拥有超过 100 台网络打印机的客户报告说,执行此代码的行为在第一次运行时表现不佳。
在看到查找结果被缓存后,我最初在一个单独的线程中部署了一个虚拟查找(在启动时执行)。但是,对于特定客户,此解决方案不起作用。
我目前没有他们的环境,也看不到是什么导致了确切的性能问题。
我正在尝试查看 a 是否PrintService
支持给定MediaSizeName
而不DocFlavor
执行and的查找AttributeSet
。所以我拉出所有可用PrintService
的 s 和默认值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声明 when使用isAttributeValueSupported(Attribute attrval,DocFlavor flavor,AttributeSet attributes)
nullDocFlavor
和AttributeSet
这个方法告诉这个打印服务是否支持给定的打印属性值,用于文档风格和属性集的某些可能的组合
并且到目前为止表现正确。但是,如果打印机支持选定的页面大小,我不完全确定这是否是执行方式。
我将感谢您对此问题的反馈和经验。
更新
大约在我实施我的方法时,我的工作站决定出现严重的网络问题,我花了一段时间才弄清楚。最后,我的实现已经用网络工具SoftPerfect Connection Emulator(模拟网络负载)进行了测试,结果并没有显着改善。
我将继续测试和更新这个问题。希望我能找到解决方案并与这里的人分享。我猜最初的查找:
private static final PrintService[] PRINTSERVICES =
PrintServiceLookup.lookupPrintServices(null, null);
仍然导致问题。
更新 2
beta 版本最终在客户端环境中进行了测试,打印对话框的性能提高了大约 5 倍(现在在相同环境下,打印机的初始拉动大约需要 1 分钟,而在相同环境下大约需要 5 分钟)。最初的等待时间仍然不是可接受的时间量,但是,这是我现在能做的最好的时间。我们还从客户那里听说正在使用打印服务器,并且按照评论 (@Wardy) 中的建议,我将朝着这个方向前进。希望我们可以利用打印服务器的优势。