2017-05-10 8 views
0

私は耳にパッケージ化されたエンタープライズアプリケーションを開発しています。耳はEnterprise Beanアプリケーション(jar)1つ、JAX-RSアプリケーション(戦争)1つ、Webアプリケーション(戦争)で構成されています。WebSphere Libertyは複数のシングルトンEJBインスタンスを開始します

耳記述子(application.xmlには)次のようになります

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE application PUBLIC 
    "-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN" 
    "http://java.sun.com/dtd/application_1_3.dtd"> 
<application> 
    <display-name>myapp-ear</display-name> 
    <module> 
    <web> 
     <web-uri>myapp-war-1.0.0-SNAPSHOT.war</web-uri> 
     <context-root>/</context-root> 
    </web> 
    </module> 
    <module> 
    <web> 
     <web-uri>myapp-rest-1.0.0-SNAPSHOT.war</web-uri> 
     <context-root>/api</context-root> 
    </web> 
    </module> 
    <module> 
    <ejb>myapp-ejb-1.0.0-SNAPSHOT.jar</ejb> 
    </module> 
</application> 

EJBアプリケーションは@Schedule方法が含ま@Singleton、@LocalBeanと@Startupで注釈シングルトンEJBを含んでいます。

サーバーがスケジュールされたメソッドの3つのインスタンスを同時に開始したことに気付きました。さらにログを調べると、Beanが3回バインドされることがわかります。

これはドキュメントhttp://docs.oracle.com/javaee/6/tutorial/doc/gipjg.html

しかしに従ってある:私は、この動作を示さない完全なプロファイルWebSphereサーバー上で実行されている同様のアプリケーションを持っています。代わりに、エンタープライズアプリケーション全体で1つのインスタンスしか存在しません。

、これは誤りである場合WLPサーバは、Javaバージョン1.8.0_101

質問があると17.0.0.1を実行している - または私はWLPで、いくつかの重要な設定をしないのですか?

答えて

0

あなたが本当に仕様を正しく読んでいるようです。シングルトンBeanは「JVMごとに1つのアプリケーションごとに」強制されます。

Libertyは仕様に準拠して動作しているようです。 WebSphereの伝統的な(フル・プロファイルとも呼ばれる)WebSphere上で観察されている動作は、異なるアプリケーション/ EJB設定、または複数のアプリケーション間でシングルトンEJBを制限することを可能にすることにより、仕様を超えて上回るWebSphereの伝統的な特別機能です。

+0

:もっと私はそれについて考え、文書化された機能は、時にあまり意味がありません。アプリケーション全体を耳に入れてパッケージ化しています。あなたは通常、1つのインスタンスだけを必要とします - それ以外はすべて一緒にパッケージし、シングルトンを使用するのはなぜですか? – danishrulez

2

クラスは、EJBの一意のIDを特定しません。すべてのEJBは、<app name>/<module name>/<bean name>で構成される3つの部分の一意の識別子を持っています。したがって、同じクラスが3つの場所にパッケージ化されている場合、3つの別々のEJB定義が存在します。また、1つの場所にEJBクラスをパッケージ化することもできますが、3つの別々のejb-jar.xmlファイルからEJBとして識別すると、3つのクラスがあります(クラスが共有ロケーションにあると仮定します)。これはすべてのEJB型に当てはまりますが、シングルトンはその動作をより明白にすることができます。

この動作は、Libertyとフル・プロファイルWebSphereの両方で同じです。フル・プロファイルのWebSphereで動作が異なると思われる場合は、パッケージングの別の制限が原因である可能性があります。たとえば、metadata-complete=trueのファイルejb-jar.xmlを含むWARまたはJARでシングルトンクラスをパッケージ化し、そのファイルがシングルトンをEJBとして定義しない場合は、無視されます。同様に、2.5以降のバージョンのWARモジュールでシングルトンをパッケージ化する場合、WARモジュールはEJBを含むことをサポートしないため、シングルトンは無視されます。

+0

シングルトンのBeanクラスは、EJBモジュール内の1つの場所にのみパッケージ化されています。いずれのプロジェクトにもejb-jar.xmはありません。すべてのEJBに注釈が付けられます。他のモジュールは、必要に応じて@EJBアノテーションを使用してセッションBeanを注入し、独自のEJBを定義しません。 – danishrulez

2

Duh!

問題は、pom.xmlのEJBアーカイブに対するMaven依存関係が正しく構成されていないことが判明しました。 PROVIDED依存関係はCOMPILE依存関係として設定されていました.MavenがEJB jarを2つのwarファイルにパッケージ化する原因となりました。

私は両方のWebアプリケーションでそれを変更しました。シングルトンは今や耳全体に対して一度だけインスタンス化されています。enybody他の場合には

は、この問題を戦っている、必ずあなたの依存性は、次のように作成されます唯一の事はある

<dependency> 
    <groupId>com.acme.myapp</groupId> 
    <artifactId>myapp-ejb</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <type>ejb</type> 
    <scope>provided</scope> 
</dependency> 
関連する問題