この記事で学べること
Stateの再発行機能や、Transacitionのチェーン検証の遡及について理解できる。
はじめに
本稿について
この記事はCorDappsの任意のflowからCordaではないWebサービスやアプリケーションにアクセスするための方法についてご紹介します。
外部接続の仕組み
前提
例えばCordaは他のノードやNotaryから応答を待つ間にflowを一時中断することができます。この機能によりCordaはスレッドを他のflowの実行に割り当てることができ、リソースを効率よく使用することができます。
これはCordaがCorda外のWebサービスなどにアクセスするときも同等です。つまり、レスポンスを待つ間はそのflowを中断させて別のflowのためにリソースを明け渡すことができます。
(これによりレスポンスに長時間必要なサービスや、停止するおそれのあるサービスからの情報取得する状況でも安全です)
インタフェース
Cordaは上記のようなケースに対応するためのインタフェースを2つ用意しています。これらのインタフェースはFlowlogic.awaitから呼び出す形式になっています。awaitはパラメータとして、今から紹介するいずれかのインタフェースで実装されたflowを必須としています。
- FlowExternalOperation: FlowExternalOperationは、FlowExternalOperation.executeの結果が取得されるまでflowを中断させることができます。
- FlowExternalAsyncOperation: FlowExternalAsyncOperationは、FlowExternalAsyncOperation.executeの結果が取得されるまでflowを中断させる(≒スレッドを他のflowのために明け渡す)ことができます。FlowExternalOperationとの大きな違いは、FlowExternalAsyncOperationは実行の結果をCompletableFutureで受け取ります。
実装
FlowExternalOperation
- flowのcallメソッドの中からawaitメソッドを呼び出します。そのパラメータとしてFlowExternalOperationを実装したメソッドを渡します。上図では、RetrieveDataFromExternalSystemがそれに該当します。
- RetrieveDataFromExternalSystem内ではexecuteが実装されています。実際に接続されるのはこの「externalService.retrieveDataFromExternalSystem」で実行されます。
- 「externalService.retrieveDataFromExternalSystem」はCordaServiceアノテーションが付与されたクラスです。CordaServiceは起動時にインスタンスの数が1に保証されるシングルトンです。FlowExternalOperationのexecuteに渡すクラスをCordaServiceにすることは必須条件ではないですが、リソースの節約には効果的です。
FlowExternalAsyncOperation
- FlowExternalAsyncOperationはFlowExternalOperationと呼び出し形式が似ています。すなわち、flowのcallメソッドの中からawaitメソッドを呼び出します。そのパラメータとしてFlowExternalAsyncOperationを実装したメソッドを渡します。上図では、RetrieveDataFromExternalSystemがそれに該当します。
- RetrieveDataFromExternalSystem内ではexecuteが実装されています。実際に接続されるのはこの「externalService.retrieveDataFromExternalSystem」で実行されます。
- 「externalService.retrieveDataFromExternalSystem」もFlowExternalOperationと似ていますが、復帰値がCompletableFuture<R>であることが大きな違いです。
- また、クラスの中でExecutors.newFixedThreadPoolを呼び出してスレッドを生成しています。これは、「retrieveDataFromExternalSystem」内のCompletableFuture.supplyAsyncの第二パラメータとして使用されます。
終わりに
いかがでしたでしょうか?既存システムとの接続にご活用ください。また、テストコードとして「MockWebServer」などを使用すると単体テストの品質向上が期待できますので併せてご活用ください。
最後までお読みいただきありがとうございます。当社では、
メールマガジン
やX
、イベントコミュニティ
を運営しております。また「BCを活用した新規事業を作りたい」「企業でのBC活用方法が分からない」等々、ご要望がございましたらメールでのお問い合わせも承っておりますので、ご気軽にご相談ください。Written by 立山 和人 (Kazuto Tateyama)
SBI R3 Japan エンジニアリング部所属 ソリューションアーキテクト/PoC支援 This is the way. みんなでキャズムを超えていきましょう! →筆者の記事一覧