在讨论Making asynchronous HTTP calls from flows
时提出了这个问题假设我们正在实施贷款申请。收到LoanRequest
后,Corda流将进行HTTP调用以验证请求,我们希望根据HTTP调用的结果自动调用其他事务,即记录ApprovedLoan
或RejectedLoan
状态。
这种情况下的问题是,ApprovedLoan
或RejectedLoan
事务将需要输入状态为LoanRequest
。因此,我们无法从LoanRequest
流的Acceptor调用另一个流,因为尚未提交输入状态,从而导致竞争状态。
任何有关如何实现此建议的建议或示例。
谢谢。
答案 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.")
}
}
}