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」などを使用すると単体テストの品質向上が期待できますので併せてご活用ください。
<ご質問・ご要望の例>
- Corda Portalの記事について質問したい
- ブロックチェーンを活用した新規事業を相談したい
- 企業でのブロックチェーン活用方法を教えて欲しい 等々
SBI R3 Japan エンジニアリング部所属
ソリューションアーキテクト/PoC支援
This is the way. みんなでキャズムを超えていきましょう!