1概要

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

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

推奨サーバーソリューションとしてhttp://wildfly.org[

WildFly 10.1.0

]を使用しますが、任意のJava Enterpriseアプリケーションサーバーを自由に使用できます。


2セットアップ

まず、EJB 3.2開発に必要なMavenの依存関係と、Maven Cargoプラグインを使用するか手動で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>

最新の依存関係はhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22javax%22%20AND%20a%3A%22javaee-api%22[Maven Repository]にあります。この依存関係により、コンパイル時にすべてのJava EE 7 APIが使用可能になります。

provided

スコープは、いったんデプロイされると、依存関係はデプロイされたコンテナーによって確実に提供されます。


2.2. Maven貨物とのWildFlyセットアップ

Maven Cargoプラグインを使用してサーバーを設定する方法について説明しましょう。

これは、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.1

zipをダウンロードします。それから、

hostname



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を手動でセットアップするには、http://wildfly.org/downloads/[wildfly.org]Webサイトからインストール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に接続するために使用されます。ユーザーを追加する方法を見つけるには、https://docs.jboss.org/author/display/WFLY10/add-userユーティリティ[ユーザーの追加ドキュメント]をご覧ください。

詳しい設定方法については、WildFlyのhttps://docs.jboss.org/author/display/WFLY10/Getting Started Guide[はじめに]をご覧ください。

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

ejb-remote

ディレクトリで次のコマンドを実行します。

mvn clean install wildfly:deploy -Pwildfly-runtime


3

リモート



ローカル


Beanのビジネスインタフェースは、

local

または

remote.

のいずれかです。


@ Local

アノテーション付きBeanは、呼び出し元のBeanと同じアプリケーション内にある場合、つまりそれらが同じ

.ear

または

.war

にある場合にのみアクセスできます。


@ Remote

注釈付きBeanは、異なるアプリケーション、つまり異なる

JVM

またはアプリケーションサーバーに存在するアプリケーションからアクセスできます。

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


  • java.io.Serializable



    java.io.Externalizable

    、およびインターフェース


javax.ejb

パッケージで定義されたBeanは、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のオブジェクトのプールを作成し、これらのオブジェクトを使用してクライアント要求を処理します。このプールメカニズムの結果として、インスタンス変数の値がlookupメソッド呼び出し間で維持されることが保証されていません。


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をデプロイする

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

次に、リモートセットアップを実行するために、

ejb-remote

プロジェクトのpomファイルに対して次のMavenコマンドを実行する必要があります。

mvn clean install

それから我々は実行する必要があります:

mvn wildfly:deploy

あるいは、アプリケーションサーバーの管理コンソールから

admin

ユーザーとして手動でデプロイすることもできます


_.

_


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

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

まず、クライアントプロジェクト用の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>


<type>



ejb

として指定されています。




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デプロイメントを使用した
アプリケーション名は空になります
** ____は先ほど展開用に設定した名前です。


ejb-remote

**

$ \ {distinctName}

は特定の名前です。

サーバーにデプロイされているデプロイメントに割り当てられています。もし
デプロイメントは

個別名

を使用せず、空の文字列を使用できます。
この例で行ったように、JNDI名の

distinct-name

** ____変数は、実装クラスの単純な名前です。

EJBなので、この例では

HelloWorld

です。
** ____はリモートインタフェースの完全修飾インタフェース名を表します


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

プロジェクト全体はhttps://github.com/eugenp/tutorials/tree/master/spring-ejb[over on GitHub]にあります。