サイトでの EJB の使用法と移行方法によっては、クライアント コードの変更が必要になる場合があります。変更する可能性のある領域については、次のセクションで説明します。
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 検索に 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);
...
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 を参照してください。
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 |
JRun 3.1 では、サーブレットと EJB 間の通信方法に次の変更が行われました。
UserSession.begin および UserSession.end メソッドへの呼び出しをコーディングすることによってプログラムによるスレッド保守を行っていました。JRun バージョン 3.1 では、EJB コンテキストをallaire.jrun.ejbContext セッション変数および JRun メッセージ スレッド内に自動的に保存します。セッションが終了したら、session.invalidate メソッドを呼び出します。その例については、EJB サンプル 9a を参照してください。
allaire.jrun.ejbContext セッション変数を管理する必要はありません。その例については、EJB サンプル 9b を参照してください。JRun バージョン 3.1 でクライアントをコーディングする方法の詳細については、『JRun によるアプリケーションの開発』の「EJB クライアントのコーディング」を参照してください。