2017-12-07 14 views
0

Cordaでは、フロー内から非同期HTTP要求を作成するにはどうすればよいですか? HTTPコールに対する応答を待っている間にフローを一時停止するAPI、またはコールバックを提供する方法はありますか?フローからの非同期HTTP呼び出しの作成

答えて

1

現在、Cordaは非同期HTTP要求を作成し、応答待ちの間にフローを一時停止するか、応答を受信したときに呼び出されるコールバックを提供するメカニズムを提供していません。

代わりに、フローを開始する前にHTTPリクエストを作成し、フローをインスタンス化する際にレスポンスを引数として渡すことをお勧めします。

時にはこれは不可能です。例えば、HTTP要求は、自動的に開始される応答フローによって要求されてもよく、または相手方から受信されたメッセージの内容に依存してもよい。

この場合でも、このようなワークフローは次のようにサポートできます。 LoanApplicationStateで表されるローン申請用のCorDappを作成しているとします。 HTTPコールがなければ、レスポンダはローン申請を受け入れるかどうかを知らない。

LoanApplicationStateを直接作成する代わりに、応答者が元帳に格納するUnacceptedLoanApplicationStateが作成されます。フローが終了すると、レスポンダはフローフレームワークの外部でHTTPコールを行うことができます。レスポンダは、HTTPコールの結果に基づいて、UnacceptedLoanApplicationStateLoanApplicationStateに変換するトランザクションを作成する承認フローを開始するか、受け入れたLoanApplicationStateを発行せずにUnacceptedLoanApplicationState状態を消費するリジェクトフローを開始します。

また、LoanApplicationStateにステータスフィールドを追加して、ローンが承認されているかどうかを指定することもできます。当初、ローン状態は、未承認に設定されたフィールドを有する。次に、HTTPリクエストの結果に基づいて、レスポンダは2つのフローのうちの1つを開始してLoanApplicationStateを更新し、承認済みまたは拒否ステータスで更新します。

2

Cordaはquasar fibersを使用して同期のような(非同期の)呼び出しを行います。幸いにも、クエーサーはjava's Futureguava's ListenableFutureをサポートしています。

その上で、あなたはこの

@InitiatingFlow 
class ListenableFutureFlow<V>(val futureFn:() -> ListenableFuture<V>, 
           override val progressTracker: ProgressTracker) : FlowLogic<V>() { 

    constructor(futureFn:() -> ListenableFuture<V>) : this(futureFn, tracker()) 

    companion object { 
     object EXECUTING_FUTURE: ProgressTracker.Step("Executing future call inside fiber") 
     fun tracker() = ProgressTracker(EXECUTING_FUTURE) 
    } 

    @Suspendable 
    override fun call(): V { 
     progressTracker.currentStep = EXECUTING_FUTURE 
     return AsyncListenableFuture.get(futureFn()) 
    } 
} 

のようなフローを作成することができますそして、あなたはこのようにそれを使用することができます:

val asyncResponse = subFlow(ListenableFutureFlow { myAsyncCall(param1, param2) }) 

それが最善の解決策ではないが、少なくともコルダのインフラストラクチャで動作します:)

あなたのために働くかどうか教えてください!

+0

興味深いので、この方法は現在のファイバを中断し、将来解決するときにそれを目覚めさせますか? –

+0

また、この方法ではスレッドローカルリソースがリークすることにも注意してください。 DB接続。 –

関連する問題