3.2.8. リモート呼び出しの変更

3.2.8.1. JBoss Enterprise Application Platform 5 にデプロイされ、JBoss Enterprise Application Platform 6 へリモート呼び出しを行うアプリケーションの移行

概要

JBoss Enterprise Application Platform 6 では、次の 2 つの方法でサーバーへリモート呼び出しすることができます。

  • 新しい JBoss 固有の EJB クライアント API を使用して呼び出しを行う。
  • JNDI を使用して Bean のプロキシをルックアップし、返されたプロキシ上で呼び出しを行う。
本項では 2 つ目の方法について取り上げます。JNDI を使用するクライアントは コーディングの変更が必要となります。

JBoss Enterprise Application Platform 5 では、EJB リモートインターフェースはデフォルトで JNDI にてバインドされ、ローカルインターフェースの場合は「ejbName/local」、リモートインターフェースの場合は「ejbName/remote」という名前でした。クライアントアプリケーションは 「ejbName/remote」を使用して Bean をルックアップしました。
JBoss Enterprise Application Platform 6 では、以下の構文を用いて ejb:NAMESPACE_NAME を使用して EJB へリモートアクセスします。ステートレス Bean の場合、構文は次のようになります。
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>
ステートフル Bean の場合は次のようになります。
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>?stateful
上記の構文で置き換える必要のある値は次の通りです。
  • <app-name> - デプロイされた EJB のアプリケーション名。通常、.ear サフィックスを抜かした ear 名になりますが、application.xml ファイルで名前が上書きされる場合があります。アプリケーションが .ear としてデプロイされていない場合、この値は空の文字列となります。この例は EAR としてデプロイされていないことを仮定します。
  • <module-name> - サーバー上のデプロイされた EJB のモジュール名。通常、.jar サフィックスを除いた EJB デプロイメントの jar 名になりますが、ejb-jar.xml を使用して名前が上書きされる場合があります。この例では、EJB が jboss-as-ejb-remote-app.jar にデプロイされていることを仮定しているため、モジュール名は jboss-as-ejb-remote-app になります。
  • <distinct-name> - EJB の任意の distinct name です。この例では distinct name は使用しないため、空の文字列を使用します。
  • <bean-name> - デフォルトでは Bean 実装クラスの簡単なクラス名になります。
  • <fully-qualified-classname-of-the-remote-interface> - リモートビューの完全修飾クラス名。
クライアントコードの更新

次のステートレス EJB を JBoss Enterprise Application 6 サーバーにデプロイしたことにします。これにより、Bean のリモートビューが公開されます。

@Stateless
@Remote(RemoteCalculator.class)
public class CalculatorBean implements RemoteCalculator {
 
    @Override
    public int add(int a, int b) {
        return a + b;
    }
 
    @Override
    public int subtract(int a, int b) {
        return a - b;
    }
}
JBoss Enterprise Application Platform 5 では、クライアント EJB のルックアップと呼び出しが次のようにコード化されていました。
InitialContext ctx = new InitialContext();
RemoteCalculator calculator = (RemoteCalculator) ctx.lookup("CalculatorBean/remote");
int a = 204;
int b = 340;
int sum = calculator.add(a, b);
JBoss Enterprise Application Platform 6 では前述の情報を使用して、クライアントのルックアップと呼び出しが次のようにコード化されます。
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
final String appName = "";
final String moduleName = "jboss-as-ejb-remote-app";
final String distinctName = "";
final String beanName = CalculatorBean.class.getSimpleName();
final String viewClassName = RemoteCalculator.class.getName();
final RemoteCalculator statelessRemoteCalculator =  (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
 
int a = 204;
int b = 340;
int sum = statelessRemoteCalculator.add(a, b);
クライアントがステートフル EJB にアクセスしている場合、次のようにコンテキストルックアップの最後に “?stateful” を追加する必要があります。
final RemoteCalculator statefulRemoteCalculator =  (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName + "?stateful")

サーバーおよびクライアントコードなどが含まれる完全な作業例は Quickstart にあります。詳細は、JBoss Enterprise Application Platform 6 開発ガイドの「アプリケーションの開発」の章にある「クイックスタートチュートリアルの確認」を参照してください。
JNDI を使用したリモート呼び出しの詳細については、JBoss Enterprise Application Platform 6 開発ガイドの「Enterprise JavaBeans」の章にある「JNDI を使用したリモートでのセッション Bean の呼び出し」を参照してください。