我在Tomcat 5.0中运行的Web应用程序中有一段代码,它调用javax.print.PrintServiceLookup方法lookupPrintServices(null,null)。以前,此代码返回一个大数组,按预期列出服务器上的所有打印机。最近突然有一天,它开始表现不同,现在返回一个没有打印机的零大小数组。经过相当彻底的检查,我无法确定是什么变化导致这种方法现在的行为与以前不同。
我制作了一个小型的独立测试程序,其中包含相同的方法调用。
PrintService[] printers = PrintServiceLookup.lookupPrintServices(null, null);
System.out.println("Java Version: " + System.getProperty("java.version"));
System.out.println("Printers found:");
if (printers != null) {
for (PrintService printer : printers) {
if (printer != null) {
System.out.println(" " + printer.toString());
}
}
}
System.out.println("End");
运行此程序时,的反应不同,返回打印机的完整列表。经过反复检查,我在Web应用程序的上下文初始化方法中放入了相同的代码(使用日志记录语句而不是System.print语句),它仍然返回零打印机。方法返回不同的结果,这取决于它是从web应用程序war还是从独立jar运行。
我的一些同事认为,这可能与SecurityManager有关,事实上,PrintService类的文档表明,SecurityManager的某些属性可以更改方法调用的结果。但是,在将一些代码添加到我的测试中以检索和查看Security Manager之后,在这两种情况下似乎都没有。
try {
if (sec != null) {
System.out.println(sec.toString());
sec.checkPrintJobAccess();
}
System.out.println("*-*-*-*-*Printer Access allowed!!");
}
catch (SecurityException e) {
System.out.println("*-*-*-*-*Printer NOT Access allowed!!");
}
结果是,安全管理器在这两种情况下都是null。
在另一台服务器上尝试,web应用程序和独立的jar版本都不会返回打印机。我找不到一致性。
这里发生了什么是什么导致这个javax方法调用在不同的情况下返回不同的结果?在这一天和下一天之间,网络应用程序的行为会发生什么变化?
尝试使用此选项启动服务器-DUseSunHttpHandler=true以使用JDK API而不是服务器API启动HTTP URL连接。希望这对你也有用。