Corda竞赛条件,从电流中调用其他流,但输入状态来自电流

时间:2018-08-01 07:41:54

标签: corda

在讨论Making asynchronous HTTP calls from flows

时提出了这个问题

假设我们正在实施贷款申请。收到LoanRequest后,Corda流将进行HTTP调用以验证请求,我们希望根据HTTP调用的结果自动调用其他事务,即记录ApprovedLoanRejectedLoan状态。

这种情况下的问题是,ApprovedLoanRejectedLoan事务将需要输入状态为LoanRequest。因此,我们无法从LoanRequest流的Acceptor调用另一个流,因为尚未提交输入状态,从而导致竞争状态。

任何有关如何实现此建议的建议或示例。

谢谢。

1 个答案:

答案 0 :(得分:2)

您需要先将LoanRequest事务提交到每个节点的存储,然后再在接受器中进行调用以决定是批准还是拒绝该请求。您还需要使用FlowLogic.waitForLedgerCommit来确保在存储LoanRequest之前不会开始批准或拒绝。这是一个示例:

@InitiatingFlow
@StartableByRPC
class Initiator(val otherParty: Party) : FlowLogic<SignedTransaction>() {

    /**
     * The flow logic is encapsulated within the call() method.
     */
    @Suspendable
    override fun call(): SignedTransaction {
        val session = initiateFlow(otherParty)

        val fullySignedTx: SignedTransaction = TODO("Build fully signed transaction.")

        subFlow(FinalityFlow(fullySignedTx))

        session.send(fullySignedTx.id)
    }
}

@InitiatedBy(Initiator::class)
class Acceptor(val session: FlowSession) : FlowLogic<SignedTransaction>() {
    @Suspendable
    override fun call(): SignedTransaction {
        TODO("Response logic for building fully signed transaction.")

        val txId = session.receive<SecureHash>().unwrap { secureHash -> secureHash }

        waitForLedgerCommit(txId)

        val approve: Boolean = TODO("Make HTTP call to decide whether to approve or reject.")

        if (approve) {
            TODO("Response logic for building approval transaction.")
        } else {
            TODO("Response logic for building rejection transaction.")
        }
    }
}