ン グ と 作成を行 う メ ソ ッ ド に よ っ て、 接続プールをサポー ト し ます。
ManagedConnection-基本 と な る EIS と の物理的な接続を表し ます。
ManagedConnectionMetaData- ManagedConnectionイ ン ス タ ン スに関連 付け られた基盤 と な る EIS イ ン ス タ ン スに関する情報を提供し ます。
3
つの イ ン タ フ ェースは、 こ こ で示す順番で実装するのが理想的です。こ の 3 つの イ ン タ フ ェースのほか、 使用する アダプタ の要求に合わせて、 こ の節 で説明さ れたほかの イ ン タ フ ェース を任意に実装でき ます。
ManagedConnectionFactory
javax.resource.spi.ManagedConnectionFactory
ManagedConnectionFactory イ ン タ フ ェースは、 ManagedConnection と EIS 固 有の接続フ ァ ク ト リ イ ン ス タ ン ス両方のフ ァ ク ト リ です。 こ の イ ン タ フ ェース は、ManagedConnection イ ン ス タ ン ス をマ ッ チング し た り 、 作成し た り する メ
ソ ッ ド によ って接続プールをサポー ト し ます。
ト ラ ンザクシ ョ ン境界設定
ManagedConnectionFactoryに不可欠な コ ンポーネン ト は、 ト ラ ンザ ク シ ョ ン の境界設定です。 1 つの ト ラ ンザ ク シ ョ ンに イ ン ク ルー ド さ れるプ ロ グ ラ ム文を 決定し ます。 J2EE では、 アプ リ ケーシ ョ ン サーバ と アダプタ (およびそのベー スの リ ソ ース マネージ ャ) と の間の ト ラ ンザ ク シ ョ ン管理規約を定義し ます。
ト ラ ンザ ク シ ョ ン管理規約は、 2 つの部分か ら構成 さ れ ます。 規約は、 使用する ト ラ ンザ ク シ ョ ンの種類に よ っ て異な り ます。 ト ラ ンザ ク シ ョ ンには、 2 つの種 類があ り ます。
XA
準拠 ト ラ ンザ ク シ ョ ンローカル ト ラ ンザ ク シ ョ ン
6
サービ ス アダプ タ の開発XA 準拠 ト ラ ンザク シ ョ ン
javax.transaction.xa.XAResource
ベース規約は、 分散 ト ラ ンザ ク シ ョ ン処
理環境 (DTP) における ト ラ ンザ ク シ ョ ン マネージ ャ と リ ソ ース マネージ ャ間 の取 り 決めです。 JDBC ド ラ イ バま たは JMS プ ロバ イ ダは、 グ ローバル ト ラ ン ザ ク シ ョ ン と 、 データベース ま たは メ ッ セージ サービ ス接続 と の間の関連付け をサポー ト する ために、 こ の イ ン タ フ ェース を実装し ます。XAResourceイ ン タ フ ェースは、 ト ラ ンザ ク シ ョ ンが外部 ト ラ ンザ ク シ ョ ン マ ネージ ャ で管理さ れてい る環境内のアプ リ ケーシ ョ ン プ ロ グ ラ ムでの使用を目 的 と し た ト ラ ンザ ク シ ョ ン リ ソ ース な らばどの よ う な も ので も サポー ト 可能で す。
その よ う な リ ソースの例 と し て、 アプ リ ケーシ ョ ンが複数のデータベース接続を 経由し てデータにア ク セスする よ う なデータベース管理シ ス テムが挙げ られま す。 それぞれのデータベース接続は、 ト ラ ンザ ク シ ョ ン リ ソース と し て、 ト ラ ンザ ク シ ョ ン マネージ ャに登録 さ れ ます。 ト ラ ンザ ク シ ョ ン マネージ ャは、 グ ローバル ト ラ ンザ ク シ ョ ンに関連する各接続に対し て、XAResourceを取得し ま す。 ト ラ ンザ ク シ ョ ン マネージ ャは、start() メ ソ ッ ド を使用し て、 グ ローバ ル ト ラ ンザ ク シ ョ ン と リ ソ ース を関連付け、end() メ ソ ッ ド に よ っ て ト ラ ンザ ク シ ョ ン と リ ソースの関連付けを解除し ます。 リ ソ ース マネージ ャは、 グ ロー バル ト ラ ンザ ク シ ョ ンを、start() メ ソ ッ ド 呼び出し と end() メ ソ ッ ド 呼び出 し の間にそのデータ に対し て行われたすべての作業に関連付けます。
ト ラ ンザ ク シ ョ ンの コ ミ ッ ト 時、 リ ソ ース マネージ ャは、 ト ラ ンザ ク シ ョ ン を 2 フ ェーズ コ ミ ッ ト プ ロ ト コルに従って準備、 コ ミ ッ ト 、 ま たは ロールバ ッ ク す る よ う に ト ラ ンザ ク シ ョ ン マネージ ャ か ら指示 さ れ ます。
ローカル ト ラ ンザク シ ョ ン
ローカル ト ラ ンザク シ ョ ン管理規約は、 アダプ タが、 その リ ソ ース マネージ ャ で実行 さ れる ローカル ト ラ ンザ ク シ ョ ン をサポー ト する ために、
javax.resource.spi.LocalTransactionイ ン タ フ ェース を実装する場合の規 約です。 こ の規約に よ っ て、 アプ リ ケーシ ョ ンサーバが ト ラ ンザ ク シ ョ ン管理の イ ン フ ラ ス ト ラ ク チャ と 実行時環境を整え られ ます。 アプ リ ケーシ ョ ン コ ン ポーネン ト は こ の ト ラ ンザ ク シ ョ ン イ ン フ ラ ス ト ラ ク チャ を利用し て、 コ ン ポーネン ト レベルの ト ラ ンザ ク シ ョ ン モデルをサポー ト し ます。
ト ラ ンザ ク シ ョ ンの境界設定の詳細については、 以下の URL を参照し て く だ さ い。
手順
3 : SPI
の実装アダプ タの開発
6-27
http://java.sun.com/blueprints/guidelines/designing_enterprise_applications/transaction_management/
platform/index.html
ADK 実装
ADK
では、 アダプ タに対し て AbstractManagedConnectionFactory と い う 抽象 フ ァ ンデーシ ョ ンを提供し ています。 こ のフ ァ ンデーシ ョ ンには、 以下の機能が あ り ます。アダプ タの例外およびロ グ メ ッ セージの イ ン ターナシ ョ ナ ラ イ ゼーシ ョ ンお よびローカ ラ イ ゼーシ ョ ンに関する基本サポー ト 。
ロ ギ ング ツールキ ッ ト へのフ ッ ク 。
標準接続プ ロパテ ィ (ユーザ名、 パス ワー ド、 サーバ、 接続 URL および ポー ト ) に対する ゲ ッ ター メ ソ ッ ド およびセ ッ ター メ ソ ッ ド。
アダプ タの java.util.ResourceBundleか ら収集し たアダプ タ メ タデータ へのア ク セス。
アダプ タ プロバ イ ダに よ る、 フ ァ ク ト リ の初期化プ ロ セスに対する ラ イ セン ス チェ ッ クへのプ ラ グ イ ンのサポー ト 。 ラ イ セン ス確認が失敗する と 、 ク ラ イ アン ト アプ リ ケーシ ョ ンは基本 と な る EIS に接続でき な く な り 、 その結 果、 アダプ タ も使用で き な く な り ます。
JavaBeans
ス タ イ ルのポス ト コ ン ス ト ラ ク タの初期化をサポー ト する ための状態確認。
以下の主要 メ ソ ッ ド に対し、 独自の実装が必要です。
createConnectionFactory()
createManagedConnection()
checkState()
equals()
hashCode()
matchManagedConnections()
以下の節では、 それ ら の メ ソ ッ ド について説明し ます。
6
サービ ス アダプ タ の開発createConnectionFactory()
createConnectionFactory()は、 アダプ タに対する アプ リ ケーシ ョ ン レベルの 接続ハン ド ル用のフ ァ ク ト リ です。 すなわち、 アダプ タの ク ラ イ ア ン ト は、 こ の メ ソ ッ ド によ り 返 さ れたオブジ ェ ク ト を使用し て EIS に対する接続ハン ド ルを取 得し ます。
アダプタ が CCI イ ン タ フ ェース をサポー ト する場合、
com.bea.adapter.cci.ConnectionFactoryImplの イ ン ス タ ン ス、 ま たは拡張 さ れ た ク ラ ス を返すこ と をお勧め し ます。 こ の メ ソ ッ ド を正し く 実装する ポ イ ン ト は、 ConnectionManager、 LogContext、 および ResourceAdapterMetaData を ク ラ イ アン ト API に伝播する こ と です。
コー ド リ ス ト
6-22 createConnectionFactory()
の例 protected ObjectcreateConnectionFactory(ConnectionManager connectionManager, String strAdapterName,
String strAdapterDescription, String strAdapterVersion, String strVendorName) throws ResourceException
createManagedConnection()
createManagedConnection()は、 アダプ タ に対する ManagedConnection イ ン ス タ ン スの作成に使用し ます。 以下の リ ス ト に、 こ の メ ソ ッ ド の例を示し ます。
コー ド リ ス ト
6-23 createManagedConnection()
の例 public ManagedConnectioncreateManagedConnection(Subject subject, ConnectionRequestInfo info)
throws ResourceException
ManagedConnection
イ ン ス タ ン スは、 EIS と の通信に必要な高コ ス ト リ ソ ース を カプセル化し ます。 こ の メ ソ ッ ド は、 ConnectionManager が ク ラ イ アン ト の要求 を満たすために新し い ManagedConnection が必要 と 判断し た場合に、手順
3 : SPI
の実装アダプ タの開発
6-29
ConnectionManager
に よ っ て呼び出さ れます。 アダプ タ の一般的な設計パターンでは、 こ の メ ソ ッ ド で EIS と の通信に必要な リ ソ ース を開き、 それか ら その リ ソース を新し い ManagedConnection イ ン ス タ ン スに渡すよ う に し ます。
checkState()
checkState() メ ソ ッ ド は、 AbstractManagedConnectionFactory がフ ァ ク ト リ 関 係の タ ス ク を実行する前に呼び出し ます。 こ の メ ソ ッ ド を使用し て、 初期化の必 要があ るすべての メ ンバーが正し く 初期化 さ れ ている こ と を確認し ない と 、
ManagedConnectionFactory
では分担さ れ た SPI タ ス ク を実行で き ません。こ の メ ソ ッ ド の実装は次の と お り です。
protected boolean checkState()
equals()
equals() メ ソ ッ ド は、 オブジ ェ ク ト 引数が等し いかど う かをテ ス ト し ます。 こ の メ ソ ッ ド は、 ConnectionManager が接続プールの管理に使用し ますので、 必ず 正し く 実装し て く だ さ い。 等価性比較において、 こ の メ ソ ッ ド は重要な メ ンバー をすべて組み込む必要があ り ます。
こ の メ ソ ッ ド の実装は次の と お り です。
public boolean equals(Object obj)
hashCode()
hashCode() メ ソ ッ ド は、 フ ァ ク ト リ で使用する ハ ッ シ ュ コー ド を提供し ます。
ま た、 ConnectionManager に よ る接続プールの管理に も使用 さ れます。 し たがっ て、 こ の メ ソ ッ ド は、 オブジ ェ ク ト のユニー ク性を決定する プロパテ ィ に基づい て hashCode を生成し ます。
こ の メ ソ ッ ド の実装は次の と お り です。
public int hashCode()
matchManagedConnections()
ManagedConnectionFactory
は matchManagedConnections() メ ソ ッ ド の実装が 必要です。 AbstractManagedConnectionFactory は、 AbstractManagedConnection の compareCredentials() メ ソ ッ ド に依存する matchManagedConnections()メ ソ ッ ド を実装し ます。
6
サービ ス アダプ タ の開発管理対象接続に ロ ジ ッ ク を適合さ せる ためには、AbstractManagedConnection ク ラ スが提供する compareCredentials() メ ソ ッ ド をオーバーラ イ ド し ます。
こ の メ ソ ッ ド は、 ManagedConnectionFactory が ConnectionManager に対する接 続要求 と 接続 と をマ ッ チン グする場合に呼び出さ れます。
現行では、AbstractManagedConnectionFactoryの実装は、 指定 さ れた Subject/ConnectionRequestInfoパ ラ メ ータ か ら PasswordCredentialを抽 出し ます。 ど ち ら のパ ラ メ ータ も ヌルであれば、 こ の イ ン ス タ ン スに対する
ManagedConnectionFactory
は適切なので、 こ の メ ソ ッ ド は true を返し ます。 こ の実装を、 以下の リ ス ト に示し ます。コー ド リ ス ト
6-24 compareCredentials()
の実装public boolean compareCredentials(Subject subject, ConnectionRequestInfo info) throws ResourceException
{
ILogger logger = getLogger();
次に、 ADK の ManagedConnectionFactoryを使用し て、 JAAS Subject ま たは
SPI ConnectionRequestInfo か ら、 PasswordCredential を抽出する必要があ り ます。
以下の リ ス ト に例を示し ます。
コー ド
リ ス ト 6-25 PasswordCredential の抽出
PasswordCredential pc = getFactory().getPasswordCredential(subject, info);
if (pc == null) {
logger.debug(this.toString() + ": compareCredentials
上記の リ ス ト では、 JAAS Subject および ConnectionRequestInfo がヌ ルで、 一致 し てい ます。 こ の メ ソ ッ ド は、 こ の イ ン ス タ ン スのフ ァ ク ト リ の適切性が確立 さ れる までは、 呼び出さ れません。 呼び出し の結果、 Subject と
ConnectionRequestInfo が両方 と も ヌルの場合、 デフ ォル ト に よ り 資格一致 と な
り ます。 こ の接続の ping 結果に よ り 、 比較結果の出力が決ま り ます。 以下の リ ス ト に、 プロ グ ラ ムによ る接続の ping を行 う 方法を示し ます。手順
3 : SPI
の実装アダプ タの開発
6-31
コー ド リ ス ト6-26
接続のping
return ping();
}
boolean bUserNameMatch = true;
String strPcUserName = pc.getUserName();
if (m_strUserName != null) {
logger.debug(this.toString() + ": compareCredentials >>> comparing my username ["+m_strUserName+"] with client username
["+strPcUserName+"]");
次に、 Subject ま たは ConnectionRequestInfoで指定さ れたユーザが こ ち ら の ユーザ と 同じ かど う か確認する必要があ り ます。 こ のアダプ タでは、 再認証をサ ポー ト し ていないので、 こ の 2 つのユーザ名が一致し ない場合、 こ の イ ン ス タ ン スは要求を満たすこ と がで き な く な り ます。 以下のコー ド が要求を満た し ていま す。
bUserNameMatch = m_strUserName.equals(strPcUserName);
ユーザ名が一致する と 、 こ れが継続し て良好かど う かを判別する ため、 接続の
ping
が行われます。 名前が一致し ない場合、 ping する理由はあ り ません。接続を ping するには、 以下の コー ド を使用し ます。
return bUserNameMatch ? ping() : false;
実装に関する説明
管理対象シナ リ オの場合、 アプ リ ケーシ ョ ン サーバは、 アダプ タの
ManagedConnectionFactory
に対し て
matchManagedConnections()メ ソ ッ ド
を呼び出し ます。 こ の指定では、 接続要求を満たすためにアプ リ ケーシ ョ ン サーバがどの ManagedConnectionFactoryを使用するか、 その決定については 指示し ていません。 ADK の AbstractManagedConnectionFactoryは、matchManagedConnections()を実装し ます。
こ の実装を行 う 最初の手順は、 「こ れ」 (すなわち、ConnectionManagerが
matchManagedConnections
を呼び出し た ManagedConnectionFactoryイ ン ス タ
ン ス) と アプ リ ケーシ ョ ン サーバに よ っ て提供さ れ たセ ッ ト 内の各ManagedConnectionに対する ManagedConnectionFactoryと の比較です。 同一 の ManagedConnectionFactory