代码之家  ›  专栏  ›  技术社区  ›  kleash

corda race条件,从当前流调用一些其他流,但输入状态来自当前流

  •  0
  • kleash  · 技术社区  · 8 年前

    这个问题是在讨论时提出的 Making asynchronous HTTP calls from flows

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

    现在这个场景的问题是, 批准贷款 拒付贷款 事务将需要输入状态为 借阅请求 . 所以我们不能从 借阅请求 作为输入状态的流尚未提交,因此会导致争用条件。

    关于如何实施这一点的任何建议或例子都将受到赞赏。

    谢谢。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Joel    8 年前

    LoanRequest FlowLogic.waitForLedgerCommit

    @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.")
            }
        }
    }
    
    推荐文章