1. 概要

この記事では、Enterprise JavaBean(EJB)開発を開始する方法について説明します。

エンタープライズJavaBeansは、スケーラブルで分散されたサーバー側コンポーネントの開発に使用され、通常、アプリケーションのビジネスロジックをカプセル化します。

推奨されるサーバーソリューションとしてWildFly10.1.0 を使用しますが、任意のJavaEnterpriseアプリケーションサーバーを自由に使用できます。

2. 設定

まず、EJB 3.2開発に必要なMavenの依存関係と、MavenCargoプラグインまたは手動でWildFlyアプリケーションサーバーを設定する方法について説明します。

2.1. Mavenの依存関係

EJB 3.2 を使用するには、pom.xmlファイルのdependenciesセクションに最新バージョンを追加してください。

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>
最新の依存関係はMavenリポジトリにあります。 この依存関係により、コンパイル時にすべてのJava EE7APIを使用できるようになります。 提供されたスコープは、デプロイされると、デプロイされたコンテナーによって依存関係が提供されることを保証します。

2.2. MavenCargoを使用したWildFlyのセットアップ

MavenCargoプラグインを使用してサーバーをセットアップする方法について説明しましょう。

WildFlyサーバーをプロビジョニングするMavenプロファイルのコードは次のとおりです。

<profile>
    <id>wildfly-standalone</id>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.cargo</groupId>
                <artifactId>cargo-maven2-plugin</artifactId>
                <version>${cargo-maven2-plugin.version</version>
                <configuration>
                    <container>
                        <containerId>wildfly10x</containerId>
                        <zipUrlInstaller>
                            <url>
                                http://download.jboss.org/
                                  wildfly/10.1.0.Final/
                                    wildfly-10.1.0.Final.zip
                            </url>
                        </zipUrlInstaller>
                    </container>
                    <configuration>
                        <properties>
                            <cargo.hostname>127.0.0.0</cargo.hostname>
                            <cargo.jboss.management-http.port>
                                9990
                            </cargo.jboss.management-http.port>
                            <cargo.servlet.users>
                                testUser:admin1234!
                            </cargo.servlet.users>
                        </properties>
                    </configuration>
                </configuration>
            </plugin>
        </plugins>
    </build>
</profile>

プラグインを使用して、WildFlyのWebサイトから WildFly 10.1zipを直接ダウンロードします。 次に、ホスト名 127.0.0.1 であることを確認し、ポートを9990に設定することにより、これを構成します。

次に、 cargo.servlet.users プロパティを使用して、ユーザーID testUserとパスワードadmin1234!。を使用してテストユーザーを作成します。

プラグインの構成が完了したので、Mavenターゲットを呼び出して、サーバーをダウンロード、インストール、起動し、アプリケーションをデプロイできるようになります。

これを行うには、 ejb-remote ディレクトリに移動し、次のコマンドを実行します。

mvn clean package cargo:run

このコマンドを初めて実行すると、WildFly 10.1 zipファイルがダウンロードされ、解凍されてインストールが実行され、起動されます。 また、上記のテストユーザーも追加されます。 それ以上実行しても、zipファイルは再度ダウンロードされません。

2.3. WildFlyの手動セットアップ

WildFlyを手動でセットアップするには、 wildfly.orgWebサイトからインストールzipファイルを自分でダウンロードする必要があります。 次の手順は、WildFlyサーバーのセットアッププロセスの概要です。

ファイルの内容をダウンロードしてサーバーをインストールする場所に解凍した後、次の環境変数を構成します。

JBOSS_HOME=/Users/$USER/../wildfly.x.x.Final
JAVA_HOME=`/usr/libexec/java_home -v 1.8`

次に、 bin ディレクトリで、Linuxベースのオペレーティングシステムの場合は ./ Standalone.sh を実行し、Windowsの場合は ./Standalone.batを実行します。

この後、ユーザーを追加する必要があります。 このユーザーは、リモートEJBBeanに接続するために使用されます。 ユーザーを追加する方法については、「ユーザーの追加」ドキュメントを参照してください。

セットアップ手順の詳細については、WildFlyの入門ドキュメントをご覧ください。

プロジェクトPOMは、2つのプロファイルを設定することにより、Cargoプラグインおよび手動サーバー構成で動作するように構成されています。 デフォルトでは、Cargoプラグインが選択されています。 ただし、すでにインストール、設定、実行されているWildflyサーバーにアプリケーションをデプロイするには、ejb-remoteディレクトリで次のコマンドを実行します。

mvn clean install wildfly:deploy -Pwildfly-runtime

3. リモートローカル

Beanのビジネスインターフェイスは、ローカルまたはリモートのいずれかです。

A @Local 注釈付きBeanは、呼び出しを行うBeanと同じアプリケーションにある場合にのみアクセスできます。 それらが同じ.earまたは.warにある場合。

A @Remote 注釈付きBeanは、別のアプリケーションからアクセスできます。 別のJVMまたはアプリケーションサーバーにあるアプリケーション。

EJBを含むソリューションを設計する際に留意すべき重要なポイントがいくつかあります。

  • java.io.Serializable java.io.Externalizable 、および javax.ejb パッケージで定義されたインターフェースは、Beanがで宣言されている場合は常に除外されます。 ]@Localまたは@Remote
  • Beanクラスがリモートの場合、実装されているすべてのインターフェースはリモートになります
  • Beanクラスにアノテーションが含まれていない場合、または @Local アノテーションが指定されている場合、実装されているすべてのインターフェースはローカルであると見なされます。
  • インターフェイスを含まないBeanに対して明示的に定義されているインターフェイスは、@Localとして宣言する必要があります。
  • EJB 3.2リリースは、ローカルおよびリモートのインターフェースを明示的に定義する必要がある状況に対して、より細分性を提供する傾向があります。

4. リモートEJBの作成

まず、Beanのインターフェースを作成し、それを HelloWorld:と呼びましょう。

@Remote
public interface HelloWorld {
    String getHelloWorld();
}

次に、上記のインターフェイスを実装し、具体的な実装に HelloWorldBean:という名前を付けます。

@Stateless(name = "HelloWorld")
public class HelloWorldBean implements HelloWorld {

    @Resource
    private SessionContext context;

    @Override
    public String getHelloWorld() {
        return "Welcome to EJB Tutorial!";
    }
}

クラス宣言の@Statelessアノテーションに注意してください。 これは、このBeanがステートレスセッションBeanであることを示します。 この種類のBeanには、関連付けられたクライアント状態はありませんが、インスタンスの状態を保持する可能性があり、通常は独立した操作を行うために使用されます。

@Resource アノテーションは、セッションコンテキストをリモートBeanに挿入します。

SessionContextインターフェースは、コンテナーがセッションBeanインスタンスに提供するランタイムセッションコンテキストへのアクセスを提供します。 インスタンスが作成された後、コンテナはSessionContextインターフェイスをインスタンスに渡します。 セッションコンテキストは、その存続期間中、そのインスタンスに関連付けられたままになります。

EJBコンテナは通常、ステートレスBeanのオブジェクトのプールを作成し、これらのオブジェクトを使用してクライアント要求を処理します。 このプーリングメカニズムの結果として、インスタンス変数値がルックアップメソッド呼び出し全体で維持されることが保証されません。

5. リモートセットアップ

このセクションでは、サーバー上でアプリケーションをビルドして実行するようにMavenをセットアップする方法について説明します。

プラグインを1つずつ見ていきましょう。

5.1. EJBプラグイン

以下に示すEJBプラグインは、EJBモジュールをパッケージ化するために使用されます。 EJBのバージョンを3.2として指定しました。

次のプラグイン構成を使用して、BeanのターゲットJARをセットアップします。

<plugin>
    <artifactId>maven-ejb-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <ejbVersion>3.2</ejbVersion>
    </configuration>
</plugin>

5.2. リモートEJBをデプロイする

BeanをWildFlyサーバーにデプロイするには、サーバーが稼働していることを確認します。

次に、リモートセットアップを実行するには、ejb-remoteプロジェクトのpomファイルに対して次のMavenコマンドを実行する必要があります。

mvn clean install

次に、実行する必要があります。

mvn wildfly:deploy

または、手動で展開することもできます。 管理者アプリケーションサーバーの管理コンソールからのユーザー

6. クライアントのセットアップ

リモートBeanを作成した後、クライアントを作成してデプロイされたBeanをテストする必要があります。

まず、クライアントプロジェクトのMavenセットアップについて説明しましょう。

6.1. クライアント側のMavenセットアップ

EJB3クライアントを起動するには、次の依存関係を追加する必要があります。

<dependency>
    <groupId>org.wildfly</groupId>
    <artifactId>wildfly-ejb-client-bom</artifactId>
    <type>pom</type>
    <scope>import</scope>
</dependency>

クライアントの実行は、このアプリケーションのEJBリモートビジネスインターフェイスに依存しています。 したがって、EJBクライアントのJAR依存関係を指定する必要があります。 親pomに以下を追加します。

<dependency>
    <groupId>com.baeldung.ejb</groupId>
    <artifactId>ejb-remote</artifactId>
    <type>ejb</type>
</dependency>

The として指定されます ejb

6.2. リモートBeanへのアクセス

src / main / resources の下にファイルを作成し、 jboss-ejb-client.properties という名前を付ける必要があります。このファイルには、デプロイされたBeanにアクセスするために必要なすべてのプロパティが含まれます。

remote.connections=default
remote.connection.default.host=127.0.0.1
remote.connection.default.port=8080
remote.connection.default.connect.options.org.xnio.Options
  .SASL_POLICY_NOANONYMOUS = false
remote.connection.default.connect.options.org.xnio.Options
  .SASL_POLICY_NOPLAINTEXT = false
remote.connection.default.connect.options.org.xnio.Options
  .SASL_DISALLOWED_MECHANISMS = ${host.auth:JBOSS-LOCAL-USER}
remote.connection.default.username=testUser
remote.connection.default.password=admin1234!

7. クライアントの作成

リモートのHelloWorld Beanにアクセスして使用するクラスは、com.baeldung.ejb.clientパッケージにあるEJBClient。javaに作成されています。 。

7.1. リモートBeanのURL

リモートBeanは、次の形式に準拠するURLを介して配置されます。

ejb:${appName}/${moduleName}/${distinctName}/${beanName}!${viewClassName}
  • $ {appName} は、デプロイメントのアプリケーション名です。 ここでは、EARファイルは使用していませんが、単純なJARまたはWARデプロイメントを使用しているため、アプリケーション名は空になります。
  • $ {moduleName} は、以前に展開用に設定した名前であるため、 ejb-remote
  • $ {distinctName} は、サーバーにデプロイされているデプロイメントにオプションで割り当てることができる特定の名前です。 デプロイメントでdistinct-nameを使用しない場合は、例で行ったように、distinct-nameのJNDI名に空の文字列を使用できます。
  • $ {beanName} 変数は、EJBの実装クラスの単純な名前であるため、この例では HelloWorld
  • $ {viewClassName} は、リモートインターフェイスの完全修飾インターフェイス名を示します

7.2. ルックアップロジック

次に、単純なルックアップロジックを見てみましょう。

public HelloWorld lookup() throws NamingException { 
    String appName = ""; 
    String moduleName = "remote"; 
    String distinctName = ""; 
    String beanName = "HelloWorld"; 
    String viewClassName = HelloWorld.class.getName();
    String toLookup = String.format("ejb:%s/%s/%s/%s!%s",
      appName, moduleName, distinctName, beanName, viewClassName);
    return (HelloWorld) context.lookup(toLookup);
}

作成したbeanに接続するには、コンテキストにフィードできるURLが必要です。

7.3. 初期コンテキスト

次に、セッションコンテキストを作成/初期化します。

public void createInitialContext() throws NamingException {
    Properties prop = new Properties();
    prop.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    prop.put(Context.INITIAL_CONTEXT_FACTORY, 
      "org.jboss.naming.remote.client.InitialContextFacto[ERROR]
    prop.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
    prop.put(Context.SECURITY_PRINCIPAL, "testUser");
    prop.put(Context.SECURITY_CREDENTIALS, "admin1234!");
    prop.put("jboss.naming.client.ejb.context", false);
    context = new InitialContext(prop);
}

リモートBeanに接続するには、JNDIコンテキストが必要です。 コンテキストファクトリはMavenアーティファクトorg.jboss:jboss-remote-naming によって提供され、これによりJNDIコンテキストが作成され、lookupメソッドで構築されたURLがプロキシに解決されます。リモートアプリケーションサーバープロセスに。

7.4. ルックアップパラメータの定義

パラメータContext.INITIAL_CONTEXT_FACTORY。を使用してファクトリクラスを定義します。

Context.URL_PKG_PREFIXES は、追加のネーミングコンテキストをスキャンするパッケージを定義するために使用されます。

パラメーターorg.jboss.ejb.client.scoped.context= false は、クラスパス構成ファイルからではなく、提供されたマップから接続パラメーター(接続ホストやポートなど)を読み取るようにコンテキストに指示します。 これは、さまざまなホストに接続できる必要があるJARバンドルを作成する場合に特に役立ちます。

パラメータContext.PROVIDER_URLは接続スキーマを定義し、 http-remoting://で始まる必要があります。

8. テスト

展開をテストしてセットアップを確認するには、次のテストを実行して、すべてが正しく機能することを確認します。

@Test
public void testEJBClient() {
    EJBClient ejbClient = new EJBClient();
    HelloWorldBean bean = new HelloWorldBean();
    
    assertEquals(bean.getHelloWorld(), ejbClient.getEJBRemoteMessage());
}

テストに合格すると、すべてが期待どおりに機能していることを確認できます。

9. 結論

そこで、EJBサーバーとリモートEJBのメソッドを呼び出すクライアントを作成しました。 プロジェクトは、そのサーバーの依存関係を適切に追加することにより、任意のアプリケーションサーバーで実行できます。

プロジェクト全体は、GitHubにあります。