• 検索結果がありません。

ManagedConnectionFactory

ドキュメント内 devadapt.book (ページ 95-104)

ン グ と 作成を行 う メ ソ ッ ド に よ っ て、 接続プールをサポー ト し ます。

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 Object

createConnectionFactory(ConnectionManager connectionManager, String strAdapterName,

String strAdapterDescription, String strAdapterVersion, String strVendorName) throws ResourceException

createManagedConnection()

createManagedConnection()は、 アダプ タ に対する ManagedConnection イ ン ス タ ン スの作成に使用し ます。 以下の リ ス ト に、 こ の メ ソ ッ ド の例を示し ます。

コー ド リ ス ト

6-23 createManagedConnection()

の例 public ManagedConnection

createManagedConnection(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

を持つセ ッ ト 内の各

ManagedConnection

に対

ドキュメント内 devadapt.book (ページ 95-104)