Cordaでは、フロー内から非同期HTTP要求を作成するにはどうすればよいですか? HTTPコールに対する応答を待っている間にフローを一時停止するAPI、またはコールバックを提供する方法はありますか?フローからの非同期HTTP呼び出しの作成
答えて
現在、Cordaは非同期HTTP要求を作成し、応答待ちの間にフローを一時停止するか、応答を受信したときに呼び出されるコールバックを提供するメカニズムを提供していません。
代わりに、フローを開始する前にHTTPリクエストを作成し、フローをインスタンス化する際にレスポンスを引数として渡すことをお勧めします。
時にはこれは不可能です。例えば、HTTP要求は、自動的に開始される応答フローによって要求されてもよく、または相手方から受信されたメッセージの内容に依存してもよい。
この場合でも、このようなワークフローは次のようにサポートできます。 LoanApplicationState
で表されるローン申請用のCorDappを作成しているとします。 HTTPコールがなければ、レスポンダはローン申請を受け入れるかどうかを知らない。
LoanApplicationState
を直接作成する代わりに、応答者が元帳に格納するUnacceptedLoanApplicationState
が作成されます。フローが終了すると、レスポンダはフローフレームワークの外部でHTTPコールを行うことができます。レスポンダは、HTTPコールの結果に基づいて、UnacceptedLoanApplicationState
をLoanApplicationState
に変換するトランザクションを作成する承認フローを開始するか、受け入れたLoanApplicationState
を発行せずにUnacceptedLoanApplicationState
状態を消費するリジェクトフローを開始します。
また、LoanApplicationState
にステータスフィールドを追加して、ローンが承認されているかどうかを指定することもできます。当初、ローン状態は、未承認に設定されたフィールドを有する。次に、HTTPリクエストの結果に基づいて、レスポンダは2つのフローのうちの1つを開始してLoanApplicationState
を更新し、承認済みまたは拒否ステータスで更新します。
Cordaはquasar fibers
を使用して同期のような(非同期の)呼び出しを行います。幸いにも、クエーサーはjava's Future
とguava'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) })
それが最善の解決策ではないが、少なくともコルダのインフラストラクチャで動作します:)
あなたのために働くかどうか教えてください!
- 1. $ httpリクエストの非同期呼び出し
- 2. 非同期呼び出しのフロー実行/論理コンテキスト
- 3. 非同期関数呼び出しがある場合のJavaScriptの同期フロー
- 4. 非同期ライブラリから非同期呼び出しを行う?
- 5. Java JavaScriptからの非同期呼び出しの同期
- 6. 非同期呼び出し
- 7. 非同期コードから非同期メソッドを呼び出す
- 8. ComponentDidMountでの非同期API呼び出しの作成
- 9. 非同期鋳鉄データベース呼び出しの作成方法
- 10. Djangoで作成されたAPIの非同期呼び出し
- 11. Pythonでの同期呼び出しへの非同期呼び出し
- 12. 非同期に非同期デリゲートを呼び出しますか?
- 13. 各ファイル行の非同期HTTP API呼び出し - Python
- 14. Pythonでの非同期HTTP呼び出し
- 15. ブートストラップ中の非同期HTTP呼び出し
- 16. 非同期呼び出しから非同期呼び出しに例外をスローする
- 17. 非同期呼び出しでui-gridを作成する
- 18. 非同期Java Webサービス呼び出しの呼び出し
- 19. JavaScript ES6非同期呼び出し後の呼び出し
- 20. 非同期メソッド呼び出しのテスト
- 21. のstd ::非同期呼び出し
- 22. C#非同期呼び出しのタイムアウト
- 23. 非同期呼び出しでのハンドルリダイレクト
- 24. Prism.Formsの非同期呼び出し
- 25. UIViewControllerと非同期の呼び出し
- 26. 非同期Ajax呼び出しのテスト
- 27. nodeBlockForRowAtIndexPathの非同期呼び出し
- 28. コールレスポンダーの非同期呼び出し
- 29. Swift:forループの非同期呼び出し
- 30. 非同期呼び出し後のコールタスクメソッド
興味深いので、この方法は現在のファイバを中断し、将来解決するときにそれを目覚めさせますか? –
また、この方法ではスレッドローカルリソースがリークすることにも注意してください。 DB接続。 –