1概要


Enterprise Java Beans

(EJB)はhttps://en.wikipedia.org/wiki/Java

Platform、

Enterprise__Editionの中核部分です。[Java EE specification]、分散エンタープライズレベルアプリケーションの開発を単純化することを目的としています。 EJBのライフサイクルは、http://wildfly.org/[JBoss WildFly]やhttp://www.oracle.com/us/products/middleware/cloud-app-foundation/などのアプリケーションサーバーによって処理されます。 glassfish-server/overview/index.html[Oracle GlassFish]

EJBは、トランザクション処理、コンポーネントのライフサイクル管理、依存関係の注入など、ビジネスロジックに関連しない問題を処理するのはアプリケーションサーバー次第であるため、エンタープライズレベルのソフトウェアモジュールの実装を容易にする堅牢なプログラミングモデルを提供します。

さらに、EJBの基本概念をカバーする2つの記事をすでに公開しているので、リンクをチェックしてください。

このチュートリアルでは、WildFlyに基本的なEJBモジュールを実装し、リモートクライアントからhttps://en.wikipedia.org/wiki/Java

Naming

and

Directory

Interface[JNDI]を介してEJBを呼び出す方法を示します。


2 EJBモジュールの実装

ビジネスロジックは、1つまたは複数のローカル/リモートビジネスインターフェイス(ローカル/リモートビューとも呼ばれる)によって実装されるか、またはインターフェイスを実装しないクラス(ビュー以外のインターフェイス)を通じて直接実装されます。

同じ環境、つまり同じEARファイルまたはWARファイルに存在するクライアントからBeanにアクセスする場合はローカルビジネスインタフェースが使用されますが、別の環境からBeanにアクセスする場合はリモートビジネスインタフェースが必要です。つまり、異なるJVMまたはアプリケーションサーバーです。

基本的なEJBモジュールを作成しましょう。これは1つのBeanだけで構成されます。

Beanのビジネスロジックは単純ですが、特定の

String

を大文字に変換することに限られます。


2.1. リモートビジネスインタフェースの定義

最初に

@ Remote

アノテーションで装飾された単一のリモートビジネスインターフェースを定義しましょう。

JJB 3.xの仕様によると、これは必須です。

、このBeanはリモートクライアントからアクセスされます。

@Remote
public interface TextProcessorRemote {
    String processText(String text);
}


2.2. ステートレスBeanの定義

次に、前述のリモートインタフェースを実装してビジネスロジックを実現しましょう。

@Stateless
public class TextProcessorBean implements TextProcessorRemote {
    public String processText(String text) {
        return text.toUpperCase();
    }
}


TextProcessorBean

クラスは

@ Stateless

アノテーションで装飾されたシンプルなJavaクラスです。

ステートレスBeanは、定義上、さまざまな要求にわたってインスタンスの状態を維持できる場合でも、クライアントとの会話状態を維持しません。それらの対応物であるステートフルBeanは、会話型の状態を維持します。アプリケーションサーバー用に作成するのはコストがかかるからです。

この場合、上記のクラスにはインスタンスの状態はありませんので、ステートレスにすることができます。状態がある場合は、さまざまなクライアント要求でそれを使用しても意味がありません。

Beanの動作は決定論的です。つまり、よく設計されたBeanと同じように、副作用はありません。入力

String

を受け取るだけで、その大文字バージョンを返します。


2.3. Mavenの依存関係

次に、https://search.maven.org/classic/#search%7Cga%7C1%7Cjavaee-api[

javaee-api

]Mavenアーティファクトをモジュールに追加する必要があります。これにより、すべてのJava EE 7仕様APIが提供されます。 EJBに必要なものを含みます。

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>

これで、基本的な、しかも機能的なEJBモジュールを作成できました。それをすべての潜在的なクライアントに利用可能にするために、私達はJARファイルとして私達のローカルMavenリポジトリに成果物を追加しなければなりません。


2.4. ローカルリポジトリへのEJBモジュールのインストール

これを実現する方法はいくつかあります。最も簡単なのは、Mavenのライフサイクル

クリーン – インストール

ビルドフェーズを実行することです。

mvn clean install

このコマンドは、EJBモジュールを

__ejbmodule-1.0.jar(


または

pom.xml__ファイルで指定された任意のアーティファクトID)としてローカルリポジトリにインストールします。 MavenでローカルJARをインストールする方法の詳細については、リンク:/install-local-jar-with-maven/[この記事]を参照してください。

EJBモジュールがローカルリポジトリに正しくインストールされていると仮定すると、次のステップは

TextProcessorBean

APIを利用するリモートクライアントアプリケーションを開発することです。


3リモートEJBクライアント

リモートEJBクライアントのビジネスロジックは非常にシンプルに保ちます。

まず、

TextProcessorBean

プロキシを取得するためにJNDIルックアップを実行します。

その後、プロキシの

processText()

メソッドを呼び出します。


3.1. Mavenの依存関係

EJBクライアントが正常に機能するためには、以下のMaven成果物を含める必要があります。

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.wildfly</groupId>
    <artifactId>wildfly-ejb-client-bom</artifactId>
    <version>10.1.0.Final</version>
</dependency>
<dependency>
    <groupId>com.beldung.ejbmodule</groupId>
    <artifactId>ejbmodule</artifactId>
    <version>1.0</version>
</dependency>


javaee-api

アーティファクトが含まれている理由は明らかですが、https://search.maven.org/classic/#search%7C1%7Cwildfly-ejb-client-bom[

wildfly-ejb-client-bom

]ではありません。 ** アーティファクトは、WildFlyでリモートEJB呼び出しを実行するために必要です。

大事なことを言い忘れましたが、以前のEJBモジュールをクライアントで利用できるようにする必要があるため、

ejbmodule

依存関係も追加しました。


3.2. EJBクライアントクラス

EJBクライアントが

TextProcessorBean

のプロキシを呼び出すことを考えると、非常に実用的であり、クライアントクラスに

TextApplication

という名前を付けます。

public class TextApplication {

    public static void main(String[]args) throws NamingException {
        TextProcessorRemote textProcessor = EJBFactory
          .createTextProcessorBeanFromJNDI("ejb:");
        System.out.print(textProcessor.processText("sample text"));
    }

    private static class EJBFactory {

        private static TextProcessorRemote createTextProcessorBeanFromJNDI
          (String namespace) throws NamingException {
            return lookupTextProcessorBean(namespace);
        }

        private static TextProcessorRemote lookupTextProcessorBean
          (String namespace) throws NamingException {
            Context ctx = createInitialContext();
            String appName = "";
            String moduleName = "EJBModule";
            String distinctName = "";
            String beanName = TextProcessorBean.class.getSimpleName();
            String viewClassName = TextProcessorRemote.class.getName();
            return (TextProcessorRemote) ctx.lookup(namespace
              + appName + "/" + moduleName
              + "/" + distinctName + "/" + beanName + "!" + viewClassName);
        }

        private static Context createInitialContext() throws NamingException {
            Properties jndiProperties = new Properties();
            jndiProperties.put(Context.INITIAL__CONTEXT__FACTORY,
              "org.jboss.naming.remote.client.InitialContextFactory");
            jndiProperties.put(Context.URL__PKG__PREFIXES,
              "org.jboss.ejb.client.naming");
            jndiProperties.put(Context.PROVIDER__URL,
               "http-remoting://localhost:8080");
            jndiProperties.put("jboss.naming.client.ejb.context", true);
            return new InitialContext(jndiProperties);
        }
    }
}

簡単に言うと、

TextApplication


__クラスが行うことは、Beanプロキシを取得し、サンプル文字列を使用してその

processText()__メソッドを呼び出すことだけです。

実際のルックアップは、最初にJNDI


InitialContext


インスタンスを作成するネストクラス

EJBFactory

によって実行され、その後コンストラクタに必要なJNDIパラメータを設定し、最後にBeanプロキシを検索するためにそれを使用します。

検索は、WildFly独自の「ejb:」名前空間を使用して実行されます。プロキシが明示的に呼び出されるまでクライアントはサーバーへの接続を延期するため、これによってルックアッププロセスが最適化されます。

「ejb」名前空間を使用せずにBeanプロキシをルックアップできることも同様に注目に値します。ただし、遅延ネットワーク接続のその他の利点がすべて欠けているため、クライアントのパフォーマンスが大幅に低下します。


3.3. EJBコンテキストの設定

クライアントは、Beanルックアップを実行するために接続を確立するホストとポートを知っておく必要があります。この点で、クライアントは、クラスパス(通常は

src/main/resources

フォルダの下)に置かれた

jboss-ejb-client.properties

ファイルで定義された、独自のWildFly EJBコンテキストを設定する必要があります。

endpoint.name=client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL__ENABLED=false
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.username=myusername
remote.connection.default.password=mypassword

このファイルは、デフォルトのリモート接続数、デフォルトのホスト、ポート、ユーザーの資格情報など、WildFlyへの接続を確立するために必要なすべてのパラメータを提供するので、一目瞭然です。この場合、接続は暗号化されていませんが、SSLが有効になっている可能性があります。

考慮すべき最後のことは、接続に認証が必要な場合は、https://docs.jboss.org/author/display/WFLY8/add-userユーティリティを介してWildFlyにユーザーを追加する必要があるかどうかです。[

add-user.sh/add-user.bat

utility]。**


4結論

WildFlyでEJBルックアップを実行することは、概説したプロセスに厳密に従う限り、簡単です。

いつものように、この記事に含まれる例はすべてGitHub

here

およびhttps://github.comから入手できます。/eugenp/tutorials/tree/master/spring-ejb/spring-ejb-client[ここ]。