在Corda中,保险库写入是同步还是异步

时间:2018-03-03 15:46:41

标签: corda

我编写了一个流程,它创建一个输出新状态(TransactionBuilder.signInitialTransaction)的事务,然后将其传递给FinalityFlow以进行公证/记录/广播。我的客户端应用程序通过RPC CordaRPCOps.startFlowDynamic开始此流程,并等待返回的CordaFuture s getOrThrow()。这是相当慢的,因为FinalityFlow仅在将事务传递给所有其他方/节点时才返回(事实上,如果远程节点已关闭,它似乎永远不会返回)。

我想我可以通过让我的应用程序只等待FinalityFlow完成notarizeAndRecord()来加快速度,因为我应该在我的节点库中有tx /状态,我可以放心地假设其他节点最终会传递此tx并接受它。我使用ProgressTracker实现了这一点,只等到FinalityFlowcurrentStep设置为BROADCASTING

但是,我观察的是,如果我在CordaRPCOps.vaultQueryByCriteria返回后不久查询保险库(使用notarizeAndRecord)新状态,我有时还没有归还。这是一个错误还是一些故意的异步行为,数据库没有立即写入?

要解决这个问题,我尝试与流程中的保险库同步,以便在tx / state实际写入保险库后才更新progressTracker:

val stx = serviceHub.signInitialTransaction(tx)
serviceHub.vaultService.rawUpdates.subscribe {
    logger.info("receiving update $it")
    if(it.produced.any { it.ref.txhash == stx.id }) {
        progressTracker.currentStep = RECORDED
    }
}
subFlow(FinalityFlow(stx))

我可以看到节点日志中的更新,但是RPC-Client的后续保险库查询(在节点日志中也显示了更新后的)如果之后立即执行,仍然不会返回任何内容...

我正在运行Corda v2.0。

1 个答案:

答案 0 :(得分:0)

我不知道保险库写入是否是同步的。

但是,您可以通过在保管库上创建一个observable来解决此问题,以便在记录新状态时通知您。这是我们使用其线性ID更新状态,然后等待与该线性ID匹配的保险库更新的示例:

grid.getEditorLock().commitCurrentEdit()