我一直在與PrintServiceLookup
作鬥爭; lookupPrintServices(DocFlavor flavor, AttributeSet attributes)
方法速度過慢,無法在我們的應用程序中使用初始磨合檢測打印機。擁有100多臺網絡打印機的客戶報告說,執行此代碼的行爲在第一次運行時表現不佳。確定打印機是否可以在不查找的情況下處理打印作業
看到查找結果被緩存後,我最初在一個單獨的線程(在啓動時執行)部署了一個虛擬查詢。但是,對於特定的客戶端,此解決方案不起作用。
我目前沒有他們的環境,並且看不到是什麼導致確切的性能問題。
我想看看是否PrintService
支持給定MediaSizeName
沒有執行DocFlavor
和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聲明時isAttributeValueSupported(Attribute attrval,DocFlavor flavor,AttributeSet attributes)
調用與空DocFlavor
和AttributeSet
這個方法告訴這是否打印服務支持給定的打印屬性值用於某些可能的doc風味和屬性組合的組合
and ha直到現在,他的行爲都正確無誤。但是,我不完全確定如果這是打印機支持所選頁面大小的方式。
我很感謝您對此問題的反饋和經驗。
更新
圍繞我實現我的做法的時候,我的工作站決定有嚴重的網絡問題,這花了一段時間來弄清楚。最後,我的實現已通過網絡工具SoftPerfect Connection Emulator(模擬網絡負載)進行了測試,結果沒有顯着改善。
我會繼續測試和更新這個問題。希望我能找到一個解決方案,並與這裏的人分享。我猜測最初的查詢:
private static final PrintService[] PRINTSERVICES =
PrintServiceLookup.lookupPrintServices(null, null);
仍然造成問題。
更新2
貝塔構建是在打印對話框的客戶端環境和性能最後測試是約5倍提高(打印機的初始拉現在只需在相同的約1分鐘環境相比大約5分鐘)。儘管如此,最初的等待時間並不是可以接受的時間,但是,現在我能做的最好。我們也從客戶那裏聽說一臺打印服務器正在使用中,並且遵循評論中的建議(@Wardy),我將朝這個方向前進。希望我們可以利用打印服務器的優勢。
你可以在啓動時在單獨的線程中進行實際查找嗎? – eabraham 2012-04-09 19:48:26
@eabraham正如我提到的那樣,在啓動時執行了一個虛擬查找。隨後的所有查詢都依賴於用戶輸入。 – arin 2012-04-10 00:15:17
您是否分析過該時間用於何處?我的猜測是,很多時間花費在各種類型的主機名查找上,並與一個錯誤的DNS服務器條目結合在一起。 – 2012-04-10 08:48:37