65

私は戦ってきましたPrintServiceLookup。このlookupPrintServices(DocFlavor flavor, AttributeSet attributes)方法では、最初の慣らし運転でアプリケーション内のプリンターを検出するのが非常に遅くなります。100 台を超えるネットワーク プリンターを使用するクライアントから、このコードを実行する動作が最初に実行されたときにパフォーマンスが低下することが報告されています。

検索結果がキャッシュされていることを確認した後、最初に別のスレッド内にダミーの検索を展開しました (起動時に実行されます)。ただし、特定のクライアントの場合、このソリューションは機能しません。

私は現在彼らの環境を持っておらず、正確なパフォーマンスの問題の原因を特定できません。

とのルックアップを実行せずにPrintService、 が特定の をサポートしているかどうかを確認しようとしています。したがって、利用可能なすべての とデフォルトをプルします。MediaSizeName DocFlavorAttributeSetPrintServicePrintService

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 で呼び出されDocFlavorAttributeSet

このメソッドは、この印刷サービスが、doc フレーバーと属性セットの可能な組み合わせについて、指定された印刷属性値をサポートしているかどうかを示します。

そして今まで正しく振舞ってきました。ただし、プリンターが選択したページ サイズをサポートしている場合に、この方法で実行できるかどうかは完全にはわかりません。

この問題に関するフィードバックと経験をお待ちしております。


アップデート

このアプローチを実装した頃、ワークステーションに深刻なネットワークの問題が発生していると判断されました。最後に、ネットワーク ツールのSoftPerfect Connection Emulator (ネットワーク負荷をシミュレートするため) を使用して実装をテストしましたが、結果は大幅に改善されませんでした。

この質問のテストと更新を続けます。解決策を見つけて、ここで人々と共有できることを願っています。私は最初のルックアップを推測しています:

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

まだ問題を引き起こしています。


更新 2

ベータ ビルドは最終的にクライアント環境でテストされ、印刷ダイアログのパフォーマンスが約 5 倍向上しました (プリンターの最初のプルは、約 5 分と比較して、同じ環境で約 1 分かかります)。それでも、最初の待機時間は許容できる時間ではありませんが、今のところ私ができる最善の時間です. プリント サーバーが使用されていることもクライアントから聞いており、コメント (@Wardy) の提案に従って、この方向に進んでいきます。うまくいけば、プリント サーバーの利点を活用できます。

4

2 に答える 2

2

より積極的なキャッシング。クライアントにルックアップを1回実行させ、再起動の間にキャッシュを保持します。さらに良いことに、すべてのクライアントがアクセスできる中央データストアにキャッシュを保存します。

ネットワークプリンタとその機能はそれほど頻繁には変更されないと思いますが、最終的にはキャッシュを更新する必要がありますが、「誰が」と「いつ」は環境によって異なります。

キャッシュの更新は、現在の検出をバックグラウンドで実行するクライアントによって行うことができ、変更が検出された場合はキャッシュを更新します。とにかく継続的に実行される中央コンポーネントがある場合は、一定の間隔でチェックできる良い場所になります。

ある種のディレクトリサービスがある場合は、各プリンタに接続してネットワークとCPUの負荷を軽減する機能を取得する前に、そのプリンタのリストをキャッシュと比較できます。

于 2012-05-12T13:08:43.960 に答える
0

プリンターのリストが LDAP に保存されている場合は、 LDAPを使用してプリンターを検索してみてください。

于 2012-05-11T16:24:58.963 に答える