- Transaction Manager for Microservices開発者ガイド
- XAでのアプリケーションの開発
- XAでのORDSアプリケーションの開発
- トランザクション参加側としてのORDSアプリケーションの構成
7.14.6 トランザクション参加側としてのORDSアプリケーションの構成
- MicroTxライブラリのプロパティ値を指定します。「ORDSアプリケーションのPL/SQLライブラリ・プロパティの構成」を参照してください。
- アプリケーションで必要な表やその他のデータベース・オブジェクトのためにDDLを作成します。
- デフォルト・データを挿入するために必要なDMLを追加します。
- アプリケーションの新しいRESTモジュールを作成または定義します。
- アプリケーションで必要なPL/SQL関数およびストアド・プロシージャを作成します。
- REST APIごとに、テンプレートおよびハンドラを定義します。
- RESTサービス・モジュールの名前およびベース・パスを入力します。次のコード例は、値として
accounts
を示しています。この値は、ご使用の環境に固有の情報で置き換えてください。DECLARE //Provide a name for the REST service module restModuleName VARCHAR2(256):= 'accounts'; //Provide a base path for the REST service restModuleBasePath VARCHAR2(256):= 'accounts';
l_callBackUrl
の値を設定します。たとえば、http://localhost:50080/ords/ordstest/accounts
です。TmmReturn
のパラメータも初期化します。DECLARE //Set up the callBackUrl correctly. This is generally the base URL or path of the module. l_callBackUrl VARCHAR2(256) := OWA_UTIL.get_cgi_env(''X-APEX-BASE'') || ''accounts''; l_tmmReturn TmmReturn; l_tmmReturn2 TmmReturn;
TmmStart
をコールします。次のコード・サンプルは、
TmmStart
関数をコールする方法を示しています。次の例に示すように、すべてのパラメータを渡します。TmmStart
をコールするときに、l_callBackUrl
の値を渡す必要があります。他のすべてのパラメータの値は、受信リクエスト・ヘッダーから自動的に取得されて渡されます。//Call TmmStart. Specify value for callBackUrl. l_tmmReturn := TmmStart(callBackUrl => l_callBackUrl, linkUrl => :linkUrl, requestId => :requestId, authorizationToken => :authorization, tmmTxToken => :tmmTxToken);
TmmStart
関数からオブジェクトが返され、属性proceed
が提供されます。これは、TmmStart
関数が正常に実行されたかどうか、トランザクションを先に進められるかどうかを示します。- XAトランザクションを進めるか(
l_tmmReturn.proceed
の値が0より大きい)、進めないか(l_tmmReturn.proceed
の値が0)を確認します。XAトランザクションをさらに進められる場合のみ、ビジネス・ロジックを実行します。それ以外の場合は、次のコード例に示すように、TmmStart
関数がHTTPエラー・ステータス・コードを返す必要があります。ビジネス・ロジックの実行が完了したら、TmmEnd
関数をコールします。IF (l_tmmReturn.proceed > 0) THEN //Execute your business logic only if the XA transaction can proceed further. //Execute SQLs statements or call other functions or stored procedures. doWithdraw(p_amount => :amount, p_account_id => :accountId); //Call TmmEnd at the end of the REST function. l_tmmReturn2 := TmmEnd(p_xid => l_tmmReturn.xid); :status_code := 200; ELSE :status_code := 400; --bad request END IF;
- MicroTxコールバックAPIを作成します。
createTMMCallbacks(moduleName => restModuleName);
- XAトランザクションに参加するすべてのメソッド・ハンドラを登録します。
registerXaHandler(moduleName => restModuleName, handlerPattern => ':accountId/withdraw', handlerMethod => 'POST');
次のコード・サンプルは、ハンドラを実装する方法を示しています。
DECLARE //Provide a name for the REST service module restModuleName VARCHAR2(256):= 'accounts'; //Provide a base path for the REST service restModuleBasePath VARCHAR2(256):= 'accounts'; BEGIN ORDS.define_module( p_module_name => restModuleName, p_base_path => restModuleBasePath, p_items_per_page => 0); ORDS.define_template( p_module_name => restModuleName, p_pattern => ':accountId/withdraw'); ORDS.define_handler( p_module_name => restModuleName, p_pattern => ':accountId/withdraw', p_method => 'POST', p_source_type => ORDS.source_type_plsql, p_source => ' DECLARE //Set up the callBackUrl correctly. This is generally the base URL or path of the module. //Example: http://localhost:50080/ords/ordstest/accounts l_callBackUrl VARCHAR2(256) := OWA_UTIL.get_cgi_env(''X-APEX-BASE'') || ''accounts''; l_tmmReturn TmmReturn; l_tmmReturn2 TmmReturn; BEGIN //Call TmmStart. Pass all the other parameters than the callBackUrl. l_tmmReturn := TmmStart(callBackUrl => l_callBackUrl, linkUrl => :linkUrl, requestId => :requestId, authorizationToken => :authorization, tmmTxToken => :tmmTxToken); //Check if the transaction should proceed further //(value of l_tmmReturn.proceed is greater than 0) //or not (value of l_tmmReturn.proceed is 0). //Execute your business logic only if transaction can proceed further. //If not, then return with an HTTP error code. IF (l_tmmReturn.proceed > 0) THEN //Execute your business logic. //Execute SQLs statements or call other functions or stored procedures. doWithdraw(p_amount => :amount, p_account_id => :accountId); //Call TmmEnd at the end of the REST function. l_tmmReturn2 := TmmEnd(p_xid => l_tmmReturn.xid); :status_code := 200; ELSE :status_code := 400; --bad request END IF; exception when others then :status_code := 500; END;', p_items_per_page => 0); //Create MicroTx callback APIs. createTMMCallbacks(moduleName => restModuleName); //Register all method handlers that will participate in the XA transaction. registerXaHandler(moduleName => restModuleName, handlerPattern => ':accountId/withdraw', handlerMethod => 'POST'); COMMIT; END; /
- RESTサービス・モジュールの名前およびベース・パスを入力します。次のコード例は、値として
MicroTx PL/SQLライブラリ関数を使用するORDSトランザクション参加側アプリケーションのソース・コードは、
microtx-samples
GitHubリポジトリのxa/plsql/databaseapp/ords_participant_app.sql
にあります。これは、MicroTxライブラリとアプリケーションの統合時に参照として使用できます。
親トピック: XAでのORDSアプリケーションの開発