EJB クライアントの移行

サイトでの EJB の使用法と移行方法によっては、クライアント コードの変更が必要になる場合があります。変更する可能性のある領域については、次のセクションで説明します。

PortableRemoteObject の縮小

JRun 3.0 (および EJB 仕様書の 1.0 バージョン) では、タイプ変換を使用してリモート参照を適切なタイプに変換しました。次に例を示します。

...
BidderHome bidderHome = 
  (BidderHome)context.lookup("java:comp/env/ejb/sample5a.BidderHome");
...

JRun 3.1 では、EJB 1.1 仕様書で推奨されている
javax.rmi.PortableRemoteObject.narrow メソッドがサポートされています。次に例を示します。

...
Object obj = context.lookup("java:comp/env/ejb/sample5a.BidderHome");
BidderHome bidderHome = 
  (BidderHome)javax.rmi.PortableRemoteObject.narrow(obj,
     BidderHome.class); 
...

JNDI 検索

EJB 検索

JNDI 検索に beanname または java:comp/env/ejb/beannameを使用できるようになりました。EJB 1.1 仕様書により厳密に従うには、java:comp/env/ejb/beannameの使用をお勧めします。次に例を示します。

...
Object obj = context.lookup("java:comp/env/ejb/sample5a.BidderHome");
BidderHome bidderHome = 
  (BidderHome)javax.rmi.PortableRemoteObject.narrow(obj,
     BidderHome.class); 
...

EJB データ ソース検索

JRun 3.0 では、次の 2 か所にデータ ソースを定義していました。

サーブレットおよび JSP は次のように JNDI 検索を使用してデータ ソースにアクセスしていました。

String thisDataSource = “products”; 
// 実行するSQLステートメント
String sqlStatement = "select * from products where productid='" + 
thisId + "' and version='" + thisVersion + "'";

// 接続オブジェクト
Connection dbConnection = null;
// ステートメント オブジェクト
Statement dbStatement = null;
// 結果セット オブジェクト
ResultSet dbResultSet = null;    
// データベース アクセス コードの開始
try {
  // JNDI InitialContext オブジェクトの定義
  InitialContext ctx = new InitialContext();
  // InitialContext 内でのデータソースの検索
  DataSource ds = 
    (DataSource)ctx.lookup("java:comp/env/jdbc/" + thisDataSource);
  dbConnection = ds.getConnection();
  
  // ステートメント オブジェクトの作成
  dbStatement = dbConnection.createStatement();
  // クエリの実行
  dbResultSet = dbStatement.executeQuery(sqlStatement);
  ...

EJB は次のように ResourceManager.getConnection への呼び出しを使用してデータ ソースにアクセスしていました。

try {
  Connection connection = ResourceManager.getConnection("source1");
  try {
    final Statement statement = connection.createStatement();
    final ResultSet results = 
      statement.executeQuery("SELECT value FROM account WHERE id = " +
        _context.getPrimaryKey());
...

JRun 3.1 では、EJB は JNDI 検索を使用して JMC 定義のデータ ソースにアクセスできます。1 つのデータ ソースに対して 2 つの定義を維持する必要はなくなりました。たとえば、EJB は次のコードを使用してデータ ソースにアクセスできるようになりました。

try {
  final Context context = new InitialContext();
  final DataSource source = 
    (DataSource)context.lookup("java:comp/env/jdbc/source1");
  final Connection connection = source.getConnection();
  final Statement statement = connection.createStatement();
  final ResultSet results = 
    statement.executeQuery("SELECT value FROM account WHERE id = " +
      _context.getPrimaryKey());
...

詳しい例については、EJB サンプル 2a 内の BalanceBean.java を参照してください。

リモート EJB クライアントのデータ ソース

JRun バージョン 3.1 では、クライアントはリモート データ ソースを検索して使用できます。それには、コンテキスト ファクトリ、プロバイダの URL 、ユーザ名、パスワードのすべてを使用して Properties オブジェクトを形成します。その後、InitialContext オブジェクトのインスタンスを作成し、Properties オブジェクトに渡します。次のコードのように、JNDI 検索を実行してリモート データ ソースにアクセスできるようになりました。

...
try {
  Properties properties = new Properties();
  // 初期コンテキストでのリモートプロパティの定義
  properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
    "allaire.ejipt.ContextFactory");
  properties.setProperty(Context.PROVIDER_URL, 
    "ejipt://remotehost:2773");

  String user_name = "client";
  String password = "client";
  // ユーザ名およびパスワードの定義 (この例ではハードコード)
  properties.setProperty(Context.SECURITY_PRINCIPAL, user_name);
  properties.setProperty(Context.SECURITY_CREDENTIALS, password);
  // メッセージのデバッグ
  System.out.println("new InitialContext");
  Context ctx = new InitialContext(properties);
  System.out.println("lookup");
  // リモート データ ソースの検索 (この例ではハードコード)
  // Java以外のクライアントは、
  // タイプ変換の代わりに PortableRemoteObject.narrow を使用する必要あり 
  DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/DB1");
  System.out.println("getConnection");
  // 接続の確立
  Connection conn = ds.getConnection();
  // SQLステートメントが続く
...
  // 終了メソッドが続く
...

クライアントがリモート データ ソース検索を行うには、クラスパス内に jrun.jar が必要です。クラスパス内に jrun.jar がない場合は、ClassNotFoundException が返されます。


メモ

リモート クライアントが JRun データ ソースにアクセスするには、JRun サーバ内で datasourcename.ejipt.remotelyAccessible プロパティが true に設定されている 必要があります。local.properties と deploy.properties のどちらのファイル内でコー ディングするかによって、このプロパティの構文は異なります。詳細については、" 新しいプロパティ"を参照してください。


サーブレット クライアントの変更

JRun 3.1 では、サーブレットと EJB 間の通信方法に次の変更が行われました。

JRun バージョン 3.1 でクライアントをコーディングする方法の詳細については、『JRun によるアプリケーションの開発』の「EJB クライアントのコーディング」を参照してください。