Java 确定打印机是否可以在不查找的情况下处理打印作业

Java 确定打印机是否可以在不查找的情况下处理打印作业,java,performance,printing,Java,Performance,Printing,我一直在与PrintServiceLookup作斗争;lookupPrintServices(DocFlavor-flavor,AttributeSet-attributes)方法在应用程序的初始运行中检测打印机速度过慢。拥有100多台网络打印机的客户端报告说,执行此代码的行为在第一次运行时表现不佳 在看到查找结果被缓存之后,我最初在一个单独的线程中部署了一个虚拟查找(在启动时执行)。但是,对于特定客户机,此解决方案不起作用 我目前没有他们的环境,也看不出是什么导致了确切的性能问题 我正在尝试查

我一直在与
PrintServiceLookup
作斗争;
lookupPrintServices(DocFlavor-flavor,AttributeSet-attributes)
方法在应用程序的初始运行中检测打印机速度过慢。拥有100多台网络打印机的客户端报告说,执行此代码的行为在第一次运行时表现不佳

在看到查找结果被缓存之后,我最初在一个单独的线程中部署了一个虚拟查找(在启动时执行)。但是,对于特定客户机,此解决方案不起作用

我目前没有他们的环境,也看不出是什么导致了确切的性能问题

我正在尝试查看
PrintService
是否支持给定的
MediaSizeName
,而不执行
DocFlavor
属性集的查找。因此,我提取所有可用的
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.");
     }
声明当
isAttributeValueSupported(Attribute attrval、DocFlavor flavor、AttributeSet attributes)时,
使用null
DocFlavor
AttributeSet

此方法说明此打印服务是否支持给定的打印属性值,以实现文档风格和属性集的某种可能组合

到目前为止,他的行为是正确的。但是,如果打印机支持选定的页面大小,我不能完全确定这是否是执行的方法

我将感谢您在这个问题上的反馈和经验


更新

在我实施我的方法时,我的工作站决定有严重的网络问题,这需要我花一段时间来解决。最后,我的实现已经用网络工具(模拟网络负载)进行了测试,结果没有显著改善

我将继续测试并更新此问题。希望我能找到一个解决方案,并在这里与大家分享。我猜最初的查找:

private static final PrintService[] PRINTSERVICES = 
   PrintServiceLookup.lookupPrintServices(null, null);
仍在引发问题


更新2


测试版最终在客户机环境中测试,打印对话框的性能提高了5倍左右(在相同环境下,打印机的初始拉动现在需要1分钟左右,而不是5分钟左右)。尽管如此,最初的等待时间仍然不是一个可接受的时间量,但是,这是我目前所能做的最好的时间。我们还从客户那里听说正在使用打印服务器,根据评论(@Wardy)中的建议,我将继续朝这个方向前进。希望我们可以利用打印服务器的优势。

如果打印机列表存储在LDAP中,您可以尝试使用更积极的缓存查找打印机。

更积极的缓存。让客户端执行一次查找,并在重启之间持久化缓存。更好的是,将缓存保存到所有客户端都可以访问的中央数据存储

我假设网络打印机及其功能不会经常更改,但最终必须更新缓存,但“谁”和“何时”取决于您的环境

可以由在后台运行当前发现的客户端对缓存进行更新,如果检测到更改,则更新缓存。如果您有一个连续运行的中心组件,那么这将是一个好地方,您可以在固定的时间间隔内进行检查


如果您有某种目录服务,您可以在联系每台打印机之前将其打印机列表与缓存进行比较,以获得其减少网络和cpu负载的功能。

启动时您可以在单独的线程中进行实际查找吗?@eabraham正如我提到的,启动时会执行虚拟查找。所有后续执行的查找都取决于用户输入。您是否分析了时间花在哪里?我的猜测是,很多时间都花在各种主机名查找上,再加上一个糟糕的DNS服务器条目。Windows应用程序可以在WINS中进行查找。Java应用程序无法做到这一点。这意味着,需要更多的地方,这是工作。从我所了解的打印机。。。你有一个打印服务器。。。当然,打印服务器应该有一个webservice端点,或者可以定期“轮询”来检查这些内容,然后缓存结果。那么你的应用程序就可以简单地调用web服务了,不是吗?(这样就省去了时间)我不确定MediaSizeName的主动缓存是否可能由于以下原因