2012-04-04 60 views
65

我一直在與PrintServiceLookup作鬥爭; lookupPrintServices(DocFlavor flavor, AttributeSet attributes)方法速度過慢,無法在我們的應用程序中使用初始磨合檢測打印機。擁有100多臺網絡打印機的客戶報告說,執行此代碼的行爲在第一次運行時表現不佳。確定打印機是否可以在不查找的情況下處理打印作業

看到查找結果被緩存後,我最初在一個單獨的線程(在啓動時執行)部署了一個虛擬查詢。但是,對於特定的客戶端,此解決方案不起作用。

我目前沒有他們的環境,並且看不到是什麼導致確切的性能問題。

我想看看是否PrintService支持給定MediaSizeName沒有執行DocFlavorAttributeSet查找。所以,我把所有可用的PrintService S和默認PrintService

private static final PrintService[] PRINTSERVICES = 
    PrintServiceLookup.lookupPrintServices(null, null); 

private static final PrintService DEFAULTSERVICE = 
    PrintServiceLookup.lookupDefaultPrintService(); 

,然後獲得PrintServiceMediaSizeName來自客戶端的請求。最後,我問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)調用與空DocFlavorAttributeSet

這個方法告訴這是否打印服務支持給定的打印屬性值用於某些可能的doc風味和屬性組合的組合

and ha直到現在,他的行爲都正確無誤。但是,我不完全確定如果這是打印機支持所選頁面大小的方式。

我很感謝您對此問題的反饋和經驗。


更新

圍繞我實現我的做法的時候,我的工作站決定有嚴重的網絡問題,這花了一段時間來弄清楚。最後,我的實現已通過網絡工具SoftPerfect Connection Emulator(模擬網絡負載)進行了測試,結果沒有顯着改善。

我會繼續測試和更新這個問題。希望我能找到一個解決方案,並與這裏的人分享。我猜測最初的查詢:

private static final PrintService[] PRINTSERVICES = 
    PrintServiceLookup.lookupPrintServices(null, null); 

仍然造成問題。


更新2

貝塔構建是在打印對話框的客戶端環境和性能最後測試是約5倍提高(打印機的初始拉現在只需在相同的約1分鐘環境相比大約5分鐘)。儘管如此,最初的等待時間並不是可以接受的時間,但是,現在我能做的最好。我們也從客戶那裏聽說一臺打印服務器正在使用中,並且遵循評論中的建議(@Wardy),我將朝這個方向前進。希望我們可以利用打印服務器的優勢。

+3

你可以在啓動時在單獨的線程中進行實際查找嗎? – eabraham 2012-04-09 19:48:26

+2

@eabraham正如我提到的那樣,在啓動時執行了一個虛擬查找。隨後的所有查詢都依賴於用戶輸入。 – arin 2012-04-10 00:15:17

+8

您是否分析過該時間用於何處?我的猜測是,很多時間花費在各種類型的主機名查找上,並與一個錯誤的DNS服務器條目結合在一起。 – 2012-04-10 08:48:37

回答

0

如果打印機列表存儲在LDAP中,您可以嘗試使用LDAP查找打印機。

2

更積極的緩存。讓客戶端執行一次查找並在重新啓動之間保持緩存。更好的是,將緩存保存到所有客戶端均可訪問的中央數據存儲區。

我假設網絡打印機及其功能不會經常更改,但您必須最終更新緩存,但「誰」和「何時」取決於您的環境。

對緩存的更新可以由在後臺運行當前發現的客戶端進行,並且如果檢測到更改,則會更新緩存。如果您有一個連續運行的中央組件,那將是一個您可以在固定時間間隔內檢查的好地方。

如果您有某種目錄服務,則可以在聯繫每臺打印機以獲得其降低網絡和CPU負載的能力之前,將其打印機列表與緩存進行比較。

+0

由於http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6278300,​​我不確定MediaSizeName的積極緩存是否可能 – nevets1219 2013-05-24 17:16:37

相關問題