8.5 TCCでのNode.jsアプリケーションの開発

次の TCCヘルパーメソッドを使用して、トランザクションを確定するか取り消します。イニシエータ・サービスと参加側サービスのどちらもヘルパー・メソッドにアクセスできます。

ヘルパー・メソッド 説明
ConfirmTCC(req.headers); 現在のTCCトランザクションを確定します。
CancelTCC(req.headers); 現在のTCCトランザクションを取り消します。
GetTCCId(req.headers) 現在のTCCトランザクションIDを取得します。

8.5.1 トランザクション・イニシエータとしてのNode.jsアプリケーションの構成

  1. Node.jsのMicroTxライブラリをpackage.jsonファイルに依存関係として追加します。
    "dependencies": {
        "tmmlib-node": "file:tmmlib-node-23.4.2.tgz"
      }
  2. MicroTxライブラリのプロパティ値を構成します。ライブラリ・プロパティの構成を参照してください。Node.jsアプリケーションのロギングを有効にするには、追加のプロパティを設定する必要があります。「MicroTx Node.jsライブラリのログの有効化」を参照してください。
  3. プロパティ値を定義したtmm.propertiesファイルを渡して、マイクロサービスのMicroTxライブラリ・プロパティを構成します。
    TrmConfig.init('./tmm.properties');
  4. MicroTxライブラリおよびexpressモジュール・ファイルをインポートします。
    import {HttpMethod, TrmConfig} from "tmmlib-node/util/trmutils";
    import {TCCConfig} from "tmmlib-node/tcc/tcc";
    import {NextFunction, request, Request, Response, Router} from 'express';
  5. ルーター・オブジェクトを作成します。
    次のコードを使用して、svcRouterという名前のルーター・オブジェクトを作成します。
    const svcRouter = Router();
  6. 次のコードを追加して、トランザクション・イニシエータ・サービスのRESTエンドポイントのTCCConfigオブジェクトを初期化します。トランザクション・イニシエータによって多数のREST APIエンドポイントが公開されることがありますが、TCCConfigオブジェクトを初期化する必要があるのは、TCCトランザクションに参加する必要があるREST APIエンドポイントのみです。

    次のコード・サンプルでは、トランザクション・イニシエータ・アプリケーションは/bookings REST APIエンドポイントを公開しています。

    // Initialize TCCConfig object for all the endpoints which need to participant in the TCC transaction.
    const tccConfig: TCCConfig = new TCCConfig("/bookings", svcRouter, HttpMethod.POST, 30);

    説明

    • svcRouterは、前のステップで作成したルーター・オブジェクトです。
    • 30は、トランザクション・イニシエータ・アプリケーションがリソースを予約する時間制限(秒)です。期間は整数で指定します。期限切れになった後でリソースを解放してTCCトランザクションのその部分を取り消すために必要なコードを用意するのは、アプリケーション開発者の責任です。業務要件に基づいて期限を決めてください。

    これらの値は、ご使用の環境に固有の値で置き換えてください。

    このコードを実行すると、TCCトランザクションが開始され、MicroTxによって、指定したREST APIエンドポイントからのすべての送信リクエストのヘッダーが追加されます。

8.5.2 トランザクション参加側としてのNode.jsアプリケーションの構成

開始する前に、MicroTxライブラリのプロパティ値を構成していることを確認してください。

  1. Node.jsのMicroTxライブラリをpackage.jsonファイルに依存関係として追加します。
    "dependencies": {
        "tmmlib-node": "file:tmmlib-node-23.4.2.tgz"
      }
  2. MicroTxライブラリのプロパティ値を構成します。ライブラリ・プロパティの構成を参照してください。Node.jsアプリケーションのロギングを有効にするには、追加のプロパティを設定する必要があります。「MicroTx Node.jsライブラリのログの有効化」を参照してください。
  3. プロパティ値を定義したtmm.propertiesファイルを渡して、マイクロサービスのMicroTxライブラリ・プロパティを構成します。
    TrmConfig.init('./tmm.properties');
  4. MicroTxライブラリおよびexpressモジュール・ファイルをインポートします。
    import {HttpMethod, TrmConfig} from "tmmlib-node/util/trmutils";
    import {TCCConfig} from "tmmlib-node/tcc/tcc";
    import {NextFunction, request, Request, Response, Router} from 'express';
  5. ルーター・オブジェクトを作成します。
    次のコードを使用して、svcRouter2という名前のルーター・オブジェクトを作成します。
    const svcRouter2 = Router();
  6. 次のコードを追加して、トランザクション参加側サービスの確定および取消しREST APIエンドポイントのTCCConfigオブジェクトを初期化します。

    次のコード・サンプルでは、トランザクション参加側アプリケーションは/bookings REST APIエンドポイントを公開しています。svcRouter2は、前のステップで作成したルーター・オブジェクトです。これらの値は、ご使用の環境に固有の値で置き換えてください。

    //Initialize TCCConfig object for all the endpoints which need to participant in the TCC transaction
    const tccConfig: TCCConfig = new TCCConfig("/bookings", svcRouter2, HttpMethod.POST, 30);

    説明

    • /bookingsは、トランザクション参加側サービスが公開するREST APIエンドポイントです。

    • svcRouter2は、事前に作成しておいたルーター・オブジェクトです。

  7. 次のコード・サンプルでは、トランザクション参加側サービスは、トランザクションの確定または取消しのために/bookings/:bookingId REST APIエンドポイントを公開しています。これらの値は、ご使用の環境に固有の値で置き換えてください。また、これらのエンドポイントがトランザクション参加側サービスに存在し、確定と取消しのロジックがコードに実装されていることも確認します。dohotelBooking()doConfirmBooking()およびdoCancelBooking()メソッドには、それぞれ、リソースの作成、トランザクションの確定、トランザクションの取消しのビジネス・ロジックが含まれています。ビジネス・ロジックがトランザクション参加側サービスのコードに実装され、エンドポイントが存在することを確認します。

    また、REST APIエンドポイントで使用されるHTTPメソッドも記述します。MicroTxでは、PUTメソッドを使用してトランザクションを確定し、DELETEメソッドを使用してトランザクションを取り消し、指定されたリソースURI用に予約されたリソースを解放します。

    svcRouter.post('/bookings', asyncHandler(async (req: Request, res: Response) => {
        dohotelBooking(req, res); //app-specific code to create a resource
    }));
    
    svcRouter.put('/bookings/:bookingId', asyncHandler(async (req: Request, res: Response) => {
        doConfirmBooking(req, res); //app-specific code to confirm the transaction
    }));
    
    svcRouter.delete('/bookings/:bookingId', asyncHandler(async (req: Request, res: Response) => {
        doCancelBooking(req, res); //app-specific code to cancel the transaction
    }));
  8. 前に作成したTCCConfigオブジェクトを使用して、参加側(予約済リソースURI)を既存のTCCトランザクションに登録します。これには、このリソースURIを使用してaddTccParticipantメソッドをコールします。
    const bookingUri;
    tccConfig.addTccParticipant(bookingUri);

    このコードが実行されると、イニシエータ・サービスが参加側サービスをコールしたときに、参加側サービスが既存のTCCトランザクションに参加します。また、MicroTxライブラリは、確定エンドポイントおよび取消しエンドポイントとして指定されたURIを使用して参加側サービスを登録します。