8.6 TCCでのPythonアプリケーションの開発

Pythonアプリケーション用のMicroTxクライアント・ライブラリは、新しいTCCトランザクションを開始したり、既存のTCCトランザクションに参加したりする機能を提供します。

MicroTxを使用してTCCトランザクションを管理するには、Pythonアプリケーション・コードを更新して、MicroTxクライアント・ライブラリによって提供される機能を統合します。

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

メソッド 説明
ConfirmTCC(incoming_request_headers); 現在のTCCトランザクションを確定し、HTTPレスポンスを返します。
CancelTCC(incoming_request_headers); 現在のTCCトランザクションを取り消し、HTTPレスポンスを返します。
GetTCCId(incoming_request_headers) 現在のTCCトランザクションIDの詳細を取得します。

ここで、incoming_request_headersは、キーと値のペアのディクショナリです。

8.6.1 トランザクション・イニシエータとしてのPythonアプリケーションの構成

PythonアプリケーションのフレームワークとしてFlaskまたはDjangoを選択できます。この項では、MicroTxライブラリを、Pythonアプリケーション(Flaskフレームワーク)のアプリケーション・コードと統合する手順について説明します。
  1. Pythonアプリケーション用に作成した仮想環境でターミナルを開いてから、次のコマンドを実行してPython用のMicroTxライブラリ・ファイル(installation_directory/otmm-<version>/lib/pythonフォルダ)をインストールします。
    pip3 install tmmpy-<version>.whl
  2. MicroTxライブラリのプロパティ値を構成します。新しいファイルを作成してtmm.propertiesとして保存します。次のプロパティに値を指定する必要があります。

    次の例では、プロパティのサンプル値を指定しています。ご自身の環境に基づいて値を指定してください。

    oracle.tmm.TcsUrl = http://tmm-app:9000/api/v1
    oracle.tmm.PropagateTraceHeaders = true
    server.port = 8080
    oracle.tmm.CallbackUrl = http://localhost:{server.port}

    各プロパティの詳細は、「ライブラリ・プロパティの構成」を参照してください。

    このファイルの名前と場所を書き留めてください。後でtccConfigオブジェクトを初期化するときに指定する必要があります。

  3. MicroTxのライブラリおよび例外をインポートします。tcclib.exceptionを使用して例外を処理できます。
    from tcclib.tcc import TCCClient, Middleware, http_request, TCCConfig
    import tcclib.exception as ex
  4. ミドルウェアを含むFlaskインスタンスを作成します。ミドルウェアは、Flaskインスタンスによって受信されるすべての受信リクエストのインターセプトに役立ちます。
    次のサンプル・コードによって、Flaskインスタンスとミドルウェア・オブジェクトが作成されます。
    # Create a Flask instance with the name of the current module.
    app = Flask(__name__)
    # Middleware helps to intercept all the incoming requests received by the Flask application.
    app.wsgi_app = middleware(app.wsgi_app)
  5. 次のコードを追加して、マイクロサービスのtccConfigオブジェクトを初期化します。

    構文

    tccConfig = TCCConfig(filePath=<application_properties_file_path>, timeLimitInSeconds=<integer>)

    サンプル

    tccConfig = TCCConfig(filePath="./tmm.properties", timeLimitInSeconds=300)

    説明

    • ./tmm.propertiesは、前にトランザクション・イニシエータ・サービスのMicroTxライブラリ・プロパティの値を定義したファイルの場所です。
    • 300は、トランザクション・イニシエータ・サービスがリソースを予約する時間制限(秒)です。期間は整数で指定します。期限切れになった後でリソースを解放してTCCトランザクションのその部分を取り消すために必要なコードを用意するのは、アプリケーション開発者の責任です。業務要件に基づいて期限を決めてください。

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

  6. TCCトランザクション・プロトコルは、基本のHTTP動詞(POSTPUTおよびDELETE)に依存します。各HTTPメソッドのREST APIエンドポイントを公開し、これらのエンドポイントを、ビジネス・ロジックを実行する特定の関数にマップする必要があります。アプリケーション・コードには、新しい予約を作成し、予約を確定するか取り消すためのビジネス・ロジックがすでに含まれています。app.routeデコレータを使用して、アプリケーション内の関数をHTTP動詞とURLパスにバインドします。

    トランザクション・イニシエータ・サービスの次のコード・サンプルで、サービスは様々なHTTP動詞のREST APIエンドポイントを公開しています。

    //Mandatory. The transaction initiator service must use the 
    //POST HTTP method to create a new reservation.
    @app.route('/travel-agent/api/bookings/reserve', methods=['POST'])
    def do_trip_reserve(): 
         //app-specific code to create a booking
    
    //Mandatory. Use the PUT HTTP method to confirm a reservation.
    @app.route('/travel-agent/api/confirm/<trip_booking_id>', methods=['PUT'])
    def do_trip_confirm(trip_booking_id):
         //app-specific code to confirm the specified booking ID
    
    //Mandatory. Use the DELETE HTTP method to cancel a reservation.
    @app.route('/travel-agent/api/cancel/<trip_booking_id>', methods=['DELETE'])
    def do_trip_cancel(trip_booking_id):
         //app-specific code to delete the specified booking ID
    

    説明

    • /travel-agent/api/bookings/reserve, /travel-agent/api/confirm/<trip_booking_id>および/travel-agent/api/cancel/<trip_booking_id>は、トランザクション・イニシエータ・サービスが公開するREST APIエンドポイントです。これらのエンドポイントがトランザクション・イニシエータ・サービスに存在し、確定と取消のロジックがコードに実装されていることを確認します。
    • do_trip_reserve()do_trip_confirm()、およびdo_trip_cancel()メソッドには、予約の作成、予約の確定、予約の取消しを行うビジネス・ロジックがそれぞれ含まれています。ビジネス・ロジックがトランザクション・イニシエータ・サービスのコードに実装され、エンドポイントが存在することを確認します。

8.6.2 トランザクション参加側としてのPythonアプリケーションの構成

PythonアプリケーションのフレームワークとしてFlaskまたはDjangoを選択できます。この項では、MicroTxライブラリを、Pythonアプリケーション(Flaskフレームワーク)のアプリケーション・コードと統合する手順について説明します。
  1. Pythonアプリケーション用に作成した仮想環境でターミナルを開いてから、次のコマンドを実行してPython用のMicroTxライブラリ・ファイル(installation_directory/otmm-<version>/lib/pythonフォルダ)をインストールします。
    pip3 install tmmpy-<version>.whl
  2. MicroTxライブラリのプロパティ値を構成します。新しいファイルを作成してtmm.propertiesとして保存します。次のプロパティに値を指定する必要があります。

    次の例では、プロパティのサンプル値を指定しています。ご自身の環境に基づいて値を指定してください。

    oracle.tmm.PropagateTraceHeaders = true
    server.port = 8080
    oracle.tmm.CallbackUrl = http://localhost:{server.port}

    各プロパティの詳細は、「ライブラリ・プロパティの構成」を参照してください。

    後で指定する必要があるため、このファイルの名前を書き留めてください。

  3. MicroTxのライブラリおよび例外をインポートします。tcclib.exceptionを使用して例外を処理できます。
    from tcclib.tcc import TCCClient, Middleware, http_request, TCCConfig
    import tcclib.exception as ex
  4. Flaskアプリケーションとミドルウェア・オブジェクトを作成します。
    次のサンプル・コードによって、appという名前のFlaskアプリケーションとミドルウェア・オブジェクトが作成されます。ミドルウェア・オブジェクトはFlaskアプリケーションをラップし、Flaskアプリケーションによって受信されるすべての受信リクエストをインターセプトします。
    # Create an instance of the Flask class with the name of the current module.
    app = Flask(__name__)
    # Create a middleware object to wrap around the Flask application that you have created.
    # The middleware object intercepts all the incoming requests received by the Flask application.
    app.wsgi_app = middleware(app.wsgi_app)
  5. 次のコードを追加して、マイクロサービスのtccConfigオブジェクトを初期化します。

    構文

    tccConfig = TCCConfig(filePath=<application_properties_file_path>, timeLimitInSeconds=<integer>)

    サンプル

    tccConfig = TCCConfig(filePath="./tmm.properties", timeLimitInSeconds=300)

    説明

    • ./tmm.propertiesは、トランザクション参加側サービスのMicroTxライブラリ・プロパティの値を定義したファイルの場所です。
    • 300は、トランザクション参加側サービスがリソースを予約する時間制限(秒)です。期間は整数で指定します。期限切れになった後でリソースを解放してTCCトランザクションのその部分を取り消すために必要なコードを用意するのは、アプリケーション開発者の責任です。業務要件に基づいて期限を決めてください。

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

  6. 前に作成したTCCConfigオブジェクトを使用して、参加側(予約済リソースURI)を既存のTCCトランザクションに登録します。これには、このリソースURIを使用してaddTccParticipantメソッドをコールします。
    const bookingUri;
    tccConfig.addTccParticipant(bookingUri);

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