11

私は現在、アプリケーションサーバーを考慮せずに開発された古いJavaコードに取り組んでいます。これは基本的に、入力インターフェイスと出力インターフェイスを備えた「ブラックボックスコード」の集まりです。「ブラックボックス」クラスのすべては、状態を含む静的データ構造であり、時間間隔(10秒ごと)でアルゴリズムを通過します。ブラックボックスはメインメソッドから開始されます。

これを簡単にするために、「ブラックボックス」をシングルトンにすることを考えています。基本的に、ブラックボックス内のロジックにアクセスしたい人は誰でも同じインスタンスを取得します。これにより、メッセージ駆動型Beanをブラックボックスへの入力として使用し、ある種のJMSパブリッシャーをブラックボックスの出力として使用できるようになります。

これはどれほど悪い考えですか?任意のヒント?

しかし、私が抱えている主な懸念の1つは、「ブラックボックス」コードに私が気付いていないスレッドが含まれている可能性があることです。

EJBに「アプリケーションスコープのオブジェクト」などはありますか?

注:私はGlassfishを使用しています

4

11 に答える 11

15

単純なシングルトンを使用すると、クラスター化された環境に入ると問題に直面します

このようなシナリオでは、複数の JVM に複数のクラスローダーがあり、そのクラスのインスタンスが複数あるため、singleton パターンが壊れます。

アプリ サーバー (クラスター化された環境の可能性がある) でのシングルトンの唯一の許容可能な使用は、シングルトンが完全にステートレスであり、グローバル データ/関数にアクセスするための便宜としてのみ使用される場合です。

この問題については、アプリケーション サーバー ベンダーのソリューションを確認することをお勧めします。すべてではありませんが、ほとんどのベンダーが、お客様の要件に対応するソリューションを提供しています。

具体的には、あなたが使用していると言うGlassfishについては、Singleton EJB support for Glassfish をチェックしてください。単一の注釈を追加するのと同じくらい簡単かもしれません。

于 2009-03-19T14:12:53.860 に答える
3

シングルトンを作成することは、実際には唯一の実行可能なアイデアだと思います。この「ブラック ボックス」内のコードが静的フィールドを使用することがわかっていると仮定すると、このファサードの 2 つのインスタンスを作成することは絶対に安全ではありません。それ以外の場合、結果は予測できません。

于 2009-03-19T02:22:24.207 に答える
2

悪いアイデアではありませんが、実際にはかなり良いアイデアのように思えます。

プログラム設計の観点から言えば、ブラック ボックスが概念的に、それらで動作するプロパティとメソッドを備えた「オブジェクト」である場合は、インスタンス化されたものが 1 つしかない場合でも、それをオブジェクトにします。

于 2009-03-18T23:35:25.810 に答える
2

ポイントがありませんか?「ブラックボックスコード」には状態が含まれていると述べました。MDB は宛先ごとに 1 つのインスタンスに制限されている場合がありますが、適切に構成しないと、いくつかの MDB が作成されることになります。それらはすべて、「ブラック ボックス コード」の 1 つのインスタンスで動作します。私にとっては、これは良い考えではないようです.1つのBeanが、他のBeanが数ティック前に作成した「ブラックボックスコード」状態をオーバーライドするためです。

于 2009-03-20T20:11:55.213 に答える
2

うまくいくはずですが、対処しなければならない問題がいくつかあります。

あなたが言及したように、スレッド。MDB は、独自のスレッドを作成できない EJB コンテナーで実行されるため、そこで潜在的な問題が発生します。実際のコードにアクセスできる場合 (そう思われます)、リファクタリングを行って、スレッドを削除するか、「承認された」スレッド メソッドを使用することをお勧めします。CommonJ TimerManager は、一定の間隔で何らかのタスクを実行しているため、指定されたケースでおそらく機能します。ほとんどのアプリ サーバーで使用できる実装があります (WAS と Weblogic にはそれが含まれています)。

クラスローディング - これは構成に依存します。シングルトンが同じ EAR 内の MDB から作成および操作される場合は、問題ありません。個別のEARは、異なるクラスローダーとシングルトンの複数のインスタンスを意味します。これがあなたのケースで問題になるかどうかについては、さらに情報がないとコメントできません。

于 2009-03-19T13:42:38.190 に答える
1

あなたの要件により適した成果物は JBoss MBean のように思えます。(JBoss を AS 候補として考えている場合)。

標準 MBean の例

JBoss クラスタリングの場合は、MBean をシングルトンとしてデプロイすることもできます。

JBoss によるクラスタリング

これがお役に立てば幸いです。

ラファ。

于 2009-03-23T13:40:57.857 に答える
0

IMO、Singleton のニーズに合わせて EJB コンテナーを用意することをお勧めします。Java EE 6 では、セッション Bean に @Singleton アノテーションを配置すると、名前付きシングルトンが提供されます。

于 2011-08-09T21:13:50.613 に答える
0

状態が変化する可能性のあるシングルトンを使用しないでください。

ブラック ボックス クラスのグローバル インスタンスを公開することは、適切ではないように思われます。多くの場合、シングルトンは物事を簡単にするように見えますが、ある意味でそうすることができますが、しばしば戻ってきて、コードの大部分を再構築する必要があります。

于 2009-03-21T04:16:49.447 に答える
0

Web サーバーの世界では、オブジェクトのスコープをリクエスト、セッション、またはアプリケーションに限定できます。おそらく、必要なのはアプリケーション スコープ オブジェクトです。

ドキュメントで「アプリケーション スコープ オブジェクト」または「アプリケーション ライフタイム オブジェクト」を検索してください。

于 2009-03-21T05:39:46.750 に答える
0

できるだけ早く静的を取り除くようにコードを修正してください。シングルトンは正しい方向への一歩ではありません - 誤った方向性を追加するだけです。

于 2009-03-19T15:14:26.020 に答える
0

空白のボックス用の残りのインターフェイスを作成して、クライアントが http 呼び出しを行えるようにしてみませんか?

于 2009-03-23T13:44:11.250 に答える