EJB設定の手引き

EJBセットアップのガイド

1. 概要

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

Enterprise JavaBeans are used for developing scalable, distributed, server-side componentsであり、通常はアプリケーションのビジネスロジックをカプセル化します。

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

2. セットアップ

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

2.1. メーベン依存

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


    javax
    javaee-api
    7.0
    provided

最新の依存関係はMaven Repositoryにあります。 この依存関係により、コンパイル時にすべてのJava EE 7 APIが使用可能になります。 providedスコープは、デプロイされると、デプロイされたコンテナーによって依存関係が提供されることを保証します。

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

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

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


    wildfly-standalone
    
        
            
                org.codehaus.cargo
                cargo-maven2-plugin
                ${cargo-maven2-plugin.version
                
                    
                        wildfly10x
                        
                            
                                http://download.jboss.org/
                                  wildfly/10.1.0.Final/
                                    wildfly-10.1.0.Final.zip
                            
                        
                    
                    
                        
                            127.0.0.0
                            
                                9990
                            
                            
                                testUser:admin1234!
                            
                        
                    
                
            
        
    

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

次に、cargo.servlet.usersプロパティを使用して、ユーザーIDtestUserとパスワード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を実行します。

この後、ユーザーを追加する必要があります。 このユーザーは、リモートEJB Beanへの接続に使用されます。 ユーザーを追加する方法を見つけるには、‘add a user' documentationを確認する必要があります。

詳細なセットアップ手順については、WildFlyのGetting Started documentationにアクセスしてください。

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

mvn clean install wildfly:deploy -Pwildfly-runtime

3. RemoteLocal

Beanのビジネスインターフェースは、localまたはremote.のいずれかです。

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

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

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

  • Beanが@Localまたは@Remoteで宣言されている場合、java.io.Serializablejava.io.Externalizable、およびjavax.ejbパッケージで定義されたインターフェースは常に除外されます。

  • Beanクラスがリモートの場合、実装されているすべてのインターフェースはリモートになります

  • Beanクラスにアノテーションが含まれていない場合、または@Localアノテーションが指定されている場合、実装されているすべてのインターフェースはローカルであると見なされます。

  • インターフェイスを含まないBeanに対して明示的に定義されているインターフェイスは、@Localとして宣言する必要があります。

  • EJB 3.2リリースは、ローカルおよびリモートインターフェースを明示的に定義する必要がある状況に対して、より細かく提供する傾向があります。

4. RemoteEJBの作成

まず、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であることを示しています。 This kind of bean does not have any associated client stateですが、インスタンスの状態を保持する場合があり、通常は独立した操作を行うために使用されます。

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

The SessionContext interface provides access to the runtime session context that the container provides for a session bean instance。 インスタンスが作成された後、コンテナはSessionContextインターフェイスをインスタンスに渡します。 セッションコンテキストは、その存続期間中、そのインスタンスに関連付けられたままです。

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

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

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

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

5.1. EJBプラグイン

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

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


    maven-ejb-plugin
    2.4
    
        3.2
    

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

BeanをWildFlyサーバーにデプロイするには、サーバーが稼働中であることを確認してください。

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

mvn clean install

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

mvn wildfly:deploy

または、アプリケーションサーバー.の管理コンソールからadminユーザーとして手動でデプロイすることもできます。

6. クライアント設定

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

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

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

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


    org.wildfly
    wildfly-ejb-client-bom
    pom
    import

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


    com.example.ejb
    ejb-remote
    ejb

<type>ejbとして指定されます。

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

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

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.example.ejb.clientパッケージに含まれるEJBClient.javaに作成されています。

7.1 Remote Bean URL

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

ejb:${appName}/${moduleName}/${distinctName}/${beanName}!${viewClassName}
  • ${appName}は、デプロイメントのアプリケーション名です。 ここでは、EARファイルは使用せず、単純なJARまたはWARデプロイメントを使用しているため、アプリケーション名は空になります

  • The[.crayon-pre .crayon-code] ${moduleName}##は、以前に展開用に設定した名前であるため、ejb-remoteです。

  • ${distinctName}は特定の名前であり、サーバーにデプロイされているデプロイメントにオプションで割り当てることができます。 デプロイメントでdistinct-nameを使用しない場合は、例で行ったように、distinct-nameにJNDI名に空の文字列を使用できます。

  • [.crayon-pre .crayon-code]${beanName}##変数は、EJBの実装クラスの単純な名前であるため、この例ではHelloWorldです。

  • [.crayon-pre .crayon-code]${viewClassName}##は、リモートインターフェイスの完全修飾インターフェイス名を示します

7.2 Look-up Logic

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

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 The Initial Context

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

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 Define Lookup Parameters

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

プロジェクト全体はover on GitHubで見つけることができます。