从流中进行异步HTTP调用

时间:2017-12-07 17:04:06

标签: corda

在Corda中,如何从流中发出异步HTTP请求?是否有API在等待HTTP调用响应时挂起流,或提供回调的方法?

2 个答案:

答案 0 :(得分:3)

Corda目前不提供制作异步HTTP请求的机制,然后在等待响应时挂起流,或提供在收到响应时将调用的回调。

相反,建议您在启动流之前发出HTTP请求,然后在实例化流时将响应作为参数传递。

有时,这是不可能的。例如,自动启动的响应流可能需要HTTP请求,或者它可能取决于从交易对手收到的消息的内容。

在这种情况下,您仍然可以按如下方式支持此类工作流程。假设您正在为贷款申请编写CorDapp,其表示为LoanApplicationState s。如果没有HTTP呼叫,响应者就​​不知道是否接受贷款申请。

流程不是直接创建LoanApplicationState,而是创建UnacceptedLoanApplicationState,响应者会将其存储在分类帐中。一旦流程结束,响应者就​​可以在流程框架之外进行HTTP调用。根据HTTP调用的结果,响应者将启动创建事务的批准流程以将UnacceptedLoanApplicationState转换为LoanApplicationState,或者启动拒绝流以使用{{1状态而不发出已接受的UnacceptedLoanApplicationState

或者,您可以向LoanApplicationState添加状态字段,指定贷款是否获得批准。最初,贷款状态将字段设置为未批准。然后,根据HTTP请求的结果,响应者将启动两个流中的一个来更新LoanApplicationState,并使用已批准或已拒绝状态对其进行更新。

答案 1 :(得分:1)

Corda使用quasar fibers进行同步(异步)调用。幸运的是,quasar支持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) })

这不是最好的解决方案,但至少可以使用corda的基础设施:)

让我知道它是否适合你!