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

はじめに

本稿について

この記事は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

mceclip2.png

  • flowのcallメソッドの中からawaitメソッドを呼び出します。そのパラメータとしてFlowExternalOperationを実装したメソッドを渡します。上図では、RetrieveDataFromExternalSystemがそれに該当します。
  • RetrieveDataFromExternalSystem内ではexecuteが実装されています。実際に接続されるのはこの「externalService.retrieveDataFromExternalSystem」で実行されます。

mceclip3.png

  • externalService.retrieveDataFromExternalSystem」はCordaServiceアノテーションが付与されたクラスです。CordaServiceは起動時にインスタンスの数が1に保証されるシングルトンです。FlowExternalOperationのexecuteに渡すクラスをCordaServiceにすることは必須条件ではないですが、リソースの節約には効果的です。

FlowExternalAsyncOperation

mceclip5.png

  • FlowExternalAsyncOperationはFlowExternalOperationと呼び出し形式が似ています。すなわち、flowのcallメソッドの中からawaitメソッドを呼び出します。そのパラメータとしてFlowExternalAsyncOperationを実装したメソッドを渡します。上図では、RetrieveDataFromExternalSystemがそれに該当します。
  • RetrieveDataFromExternalSystem内ではexecuteが実装されています。実際に接続されるのはこの「externalService.retrieveDataFromExternalSystem」で実行されます。

mceclip6.png

  • externalService.retrieveDataFromExternalSystem」もFlowExternalOperationと似ていますが、復帰値がCompletableFuture<R>であることが大きな違いです。
  • また、クラスの中でExecutors.newFixedThreadPoolを呼び出してスレッドを生成しています。これは、「retrieveDataFromExternalSystem」内のCompletableFuture.supplyAsyncの第二パラメータとして使用されます。

終わりに

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

 

Created by: Kazuto Tateyama

Last edited by: Kazuto Tateyama

Updated: 2021/12/03

 

 

 

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています