私は戦ってきましたPrintServiceLookup
。このlookupPrintServices(DocFlavor flavor, AttributeSet attributes)
方法では、最初の慣らし運転でアプリケーション内のプリンターを検出するのが非常に遅くなります。100 台を超えるネットワーク プリンターを使用するクライアントから、このコードを実行する動作が最初に実行されたときにパフォーマンスが低下することが報告されています。
検索結果がキャッシュされていることを確認した後、最初に別のスレッド内にダミーの検索を展開しました (起動時に実行されます)。ただし、特定のクライアントの場合、このソリューションは機能しません。
私は現在彼らの環境を持っておらず、正確なパフォーマンスの問題の原因を特定できません。
とのルックアップを実行せずにPrintService
、 が特定の をサポートしているかどうかを確認しようとしています。したがって、利用可能なすべての とデフォルトをプルします。MediaSizeName
DocFlavor
AttributeSet
PrintService
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)
が null で呼び出されDocFlavor
、AttributeSet
このメソッドは、この印刷サービスが、doc フレーバーと属性セットの可能な組み合わせについて、指定された印刷属性値をサポートしているかどうかを示します。
そして今まで正しく振舞ってきました。ただし、プリンターが選択したページ サイズをサポートしている場合に、この方法で実行できるかどうかは完全にはわかりません。
この問題に関するフィードバックと経験をお待ちしております。
アップデート
このアプローチを実装した頃、ワークステーションに深刻なネットワークの問題が発生していると判断されました。最後に、ネットワーク ツールのSoftPerfect Connection Emulator (ネットワーク負荷をシミュレートするため) を使用して実装をテストしましたが、結果は大幅に改善されませんでした。
この質問のテストと更新を続けます。解決策を見つけて、ここで人々と共有できることを願っています。私は最初のルックアップを推測しています:
private static final PrintService[] PRINTSERVICES =
PrintServiceLookup.lookupPrintServices(null, null);
まだ問題を引き起こしています。
更新 2
ベータ ビルドは最終的にクライアント環境でテストされ、印刷ダイアログのパフォーマンスが約 5 倍向上しました (プリンターの最初のプルは、約 5 分と比較して、同じ環境で約 1 分かかります)。それでも、最初の待機時間は許容できる時間ではありませんが、今のところ私ができる最善の時間です. プリント サーバーが使用されていることもクライアントから聞いており、コメント (@Wardy) の提案に従って、この方向に進んでいきます。うまくいけば、プリント サーバーの利点を活用できます。