2009-06-18 10 views
11

J2EE Beanの場合、私はJava Swingアプリケーション用に開発されたコードを再利用しています。 JOptionPane.showMessageDialog()は残念なことに一般的に使用されます。 J2EEアプリケーションで再利用されないコードセクションでは大部分が実行されますが、コードの下位レベルではJOptionPane.showMessageDialog()のインスタンスがあります。明らかにこれにより、サーバー上にダイアログボックスが表示されます。これは避けたいものです。アプリケーションサーバーでコードが実行されているかどうかを検出する最善の方法java

最初の手順として、サーバー上にダイアログボックスが表示されないようにしたいと思います。

誰かが(私はどちら覚えていません)、いくつかのイベントや塗料キューに覗き提案: それは次のようになります。

// old code: JOptionPane.showMessageDialog(msg); 
if (someEventQueue.size() == 0) // <== consider this pseudo-code 
    Log.log(msg); // I am running on a server. Tell the log. 
else 
    JOptionPane.showMessageDialog(msg); // I have a user made of meat. Tell him! 

私は本当にはその作業をやったことがなかったです。あなたならどうしますか?

+0

私はそれを正しい方法でやろうとします。 'logToUser'メソッドとのインタフェースを持ち、そのインスタンスをコード内で渡すか、静的なフィールドに渡します(他のものが実行不可能な場合)。ログする場所で、そのメソッドを呼び出します。サーバー上のコードのユーザーは実装を提供する必要があり、Swingアプリケーションは別のものを提供します(AndroidやSWT、または別のアプリケーションが別のアプリケーションを提供する必要があります)。実装が設定されているかどうかを早めにチェックし、そうでない場合は例外をスローしてください。 – mihi

答えて

23

は、デフォルトでそのように起動する必要があり、サーバーが

java -Djava.awt.headless=true 

ほとんどのサーバーで起動していることを確認します。そして、次のことが確認できます。可能なヘッドレスhere

boolean headless_check = GraphicsEnvironment.isHeadless(); 

詳細:Linux上で私はOpenJDKのランタイム環境でこれをテストした

+0

または、-Dnodialog = trueのようなカスタムシステムパラメータ。 – akarnokd

+0

良い点。それぞれの環境に固有のシステムプロパティがたくさんあります。 Oracle OC4Jアプリケーション・サーバーの場合:System.getProperty( "oracle.oc4j.instancename"); –

+0

システム依存のプロパティではありません。 -Dthis_is_a_param_for_no_dialog = true – akarnokd

0

を(IcedTeaの2.4.3)(Gentooは1.7.0_45-B31を構築)、および私はunset DISPLAYisHeadless()(そしてisHeadlessInstance())の返信をtrueにするのに十分であったことも分かります。

このメソッドは、AWTがシステムのグラフィックス機能を無視するかどうかだけでなく、プロセスがグラフィックス機能にアクセスできるかどうかを伝えます。

例:
コードは(あなたがを知りたい、おそらくだ)何の表示カードを持っていないいくつかのボックス上で実行されているので、いくつかの理由のためにあなたがヘッドレスモードかどうかを知りたい場合は、常にシステムのプロパティを確認することができます強制でした。

関連する問題