3

内部に静的ブロックを含む MDB EJB があります。静的ブロックを使用して、アプリケーションの初回実行時 (つまり、デプロイ時) に 1 回だけコンポーネントを初期化しました。MDB EJB は、Admin_Server 以外の別のサーバー (My_Server) にデプロイされます。

問題は、静的ブロックが 2 回呼び出されることです!

  • 初回: (My_Server にタグ付けされた) MDB EJB をデプロイした直後。
  • 2 回目: (MDB が関連付けられている) JMS キューがメッセージを受信した後。

また、サーバー名とpidを出力しましたが、両方で同じです:

System.out.println("server name: " + System.getProperty("weblogic.Name"));
System.out.println("pid: " + ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);

また、いくつかの奇妙な行動にも気付きました。基本的に、アプリケーションのシャットダウン時に電子メールを送信するために、Shutdown Hook を (静的ブロック内から) 添付しました。

  • My_Server をシャットダウンすると、通知が届きました。
  • Admin_Server をシャットダウンすると、通知も受け取りました。

この問題を解決するにはどうすればよいですか?


追加情報:

Weblogic version: 10.3.0
EJB version: 3.0
4

2 に答える 2

7

これは、複数のクラスローダーがある場合にのみ発生します。EJB に静的初期化子を持たず、EJB ライフサイクル フックに依存するか、初期化子をアンマネージ クラスにエクスポートします。

EJB 3.1 では @Singleton や @Startup などのアノテーションが追加されましたが、残念ながら 3.0 では、これらの保証のためにプロバイダー ベースのソリューションに行き詰まっています。

通常、WebLogic は両方にデプロイされるため、管理者と通常のサーバーの動作は非常に一般的です。詳細については、このページを参照してください。

Weblogic シャットダウン フックについては、このドキュメント ページを確認してください。

于 2013-01-21T07:18:12.653 に答える
4

はい、静的イニシャライザを複数回実行できる唯一の方法は、クラスの 2 つの異なるコピーを実際にロードした場合です。これは、両方がクラスをロードする 2 つの異なるクラスローダーがある場合にのみ発生します。

これを防ぐ方法は、問題のクラスが 2 つのクラスローダの共通の上位クラス ローダによってロードされるようにすることです。Weblogic でこれを行う方法はわかりませんが、Tomcat の場合は、関連する JAR ファイルを指定された共通ライブラリ ディレクトリに配置します。このディレクトリは、コンテナで実行されているすべての Web アプリケーションによって共有されます。

于 2013-01-21T07:32:06.947 に答える