Logo
    Logo

    Search

    R3-Solana連携

    Blockchainトレンド

    Corda活用事例

    Corda技術

    おすすめ記事

    記事を探す

    その他

    お客様サポート

    SBI R3 Japan HP

    お問い合わせ

    CorDappsのflowから外部接続をする

    公開日
    Dec 3, 2021
    カテゴリ
    Corda技術を知る
    タグ
    🧑‍💻CorDapp開発
    筆者
    立山
    image
    icon
    この記事で学べること

    Stateの再発行機能や、Transacitionのチェーン検証の遡及について理解できる。

    icon
    目次
    • はじめに
    • 本稿について
    • 外部接続の仕組み
    • 前提
    • インタフェース
    • 実装
    • FlowExternalOperation
    • FlowExternalAsyncOperation
    • 終わりに

    はじめに

    本稿について

    この記事はCorDappsの任意のflowからCordaではないWebサービスやアプリケーションにアクセスするための方法についてご紹介します。

    外部接続の仕組み

    前提

    例えばCordaは他のノードやNotaryから応答を待つ間にflowを一時中断することができます。この機能によりCordaはスレッドを他のflowの実行に割り当てることができ、リソースを効率よく使用することができます。

    これはCordaがCorda外のWebサービスなどにアクセスするときも同等です。つまり、レスポンスを待つ間はそのflowを中断させて別のflowのためにリソースを明け渡すことができます。

    (これによりレスポンスに長時間必要なサービスや、停止するおそれのあるサービスからの情報取得する状況でも安全です)

    インタフェース

    Cordaは上記のようなケースに対応するためのインタフェースを2つ用意しています。これらのインタフェースはFlowlogic.awaitから呼び出す形式になっています。awaitはパラメータとして、今から紹介するいずれかのインタフェースで実装されたflowを必須としています。

    1. FlowExternalOperation: FlowExternalOperationは、FlowExternalOperation.executeの結果が取得されるまでflowを中断させることができます。
    2. FlowExternalAsyncOperation: FlowExternalAsyncOperationは、FlowExternalAsyncOperation.executeの結果が取得されるまでflowを中断させる(≒スレッドを他のflowのために明け渡す)ことができます。FlowExternalOperationとの大きな違いは、FlowExternalAsyncOperationは実行の結果をCompletableFutureで受け取ります。

    実装

    FlowExternalOperation

    image
    • flowのcallメソッドの中からawaitメソッドを呼び出します。そのパラメータとしてFlowExternalOperationを実装したメソッドを渡します。上図では、RetrieveDataFromExternalSystemがそれに該当します。
    • RetrieveDataFromExternalSystem内ではexecuteが実装されています。実際に接続されるのはこの「externalService.retrieveDataFromExternalSystem」で実行されます。
    image
    • 「externalService.retrieveDataFromExternalSystem」はCordaServiceアノテーションが付与されたクラスです。CordaServiceは起動時にインスタンスの数が1に保証されるシングルトンです。FlowExternalOperationのexecuteに渡すクラスをCordaServiceにすることは必須条件ではないですが、リソースの節約には効果的です。

    FlowExternalAsyncOperation

    image
    • FlowExternalAsyncOperationはFlowExternalOperationと呼び出し形式が似ています。すなわち、flowのcallメソッドの中からawaitメソッドを呼び出します。そのパラメータとしてFlowExternalAsyncOperationを実装したメソッドを渡します。上図では、RetrieveDataFromExternalSystemがそれに該当します。
    • RetrieveDataFromExternalSystem内ではexecuteが実装されています。実際に接続されるのはこの「externalService.retrieveDataFromExternalSystem」で実行されます。
    image
    • 「externalService.retrieveDataFromExternalSystem」もFlowExternalOperationと似ていますが、復帰値がCompletableFuture<R>であることが大きな違いです。
    • また、クラスの中でExecutors.newFixedThreadPoolを呼び出してスレッドを生成しています。これは、「retrieveDataFromExternalSystem」内のCompletableFuture.supplyAsyncの第二パラメータとして使用されます。

    終わりに

    いかがでしたでしょうか?既存システムとの接続にご活用ください。また、テストコードとして「MockWebServer」などを使用すると単体テストの品質向上が期待できますので併せてご活用ください。

    📬
    最後までお読みいただきありがとうございます。当社へのご質問・ご要望がございましたら、📪SBI R3 Japan お問い合わせフォーム📪よりお気軽にお問い合わせください!

    <ご質問・ご要望の例>

    • Corda Portalの記事について質問したい
    • ブロックチェーンを活用した新規事業を相談したい
    • 企業でのブロックチェーン活用方法を教えて欲しい 等々
    📢
    また、厳選されたCordaに関する最新情報をお伝えるするメールマガジンやX、当社主催のイベントコミュニティを運営しております。ぜひご登録ください。
    • Cordaメールマガジンに登録
    • X(旧Twitter)をフォロー
    • 弊社イベントコミュニティ(Connpass)に参加
    ✍️
    Written by 立山 和人 (Kazuto Tateyama)
    image

    SBI R3 Japan エンジニアリング部所属

    ソリューションアーキテクト/PoC支援

    This is the way. みんなでキャズムを超えていきましょう!

    →筆者の記事一覧

    Logo

    © copyright SBI R3 Japan 2025

    GitHubYouTubeXFacebookLinkedIn