我编写了一个流程,它创建一个输出新状态(TransactionBuilder.signInitialTransaction
)的事务,然后将其传递给FinalityFlow
以进行公证/记录/广播。我的客户端应用程序通过RPC CordaRPCOps.startFlowDynamic
开始此流程,并等待返回的CordaFuture
s getOrThrow()
。这是相当慢的,因为FinalityFlow
仅在将事务传递给所有其他方/节点时才返回(事实上,如果远程节点已关闭,它似乎永远不会返回)。
我想我可以通过让我的应用程序只等待FinalityFlow
完成notarizeAndRecord()
来加快速度,因为我应该在我的节点库中有tx /状态,我可以放心地假设其他节点最终会传递此tx并接受它。我使用ProgressTracker
实现了这一点,只等到FinalityFlow
将currentStep
设置为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。
答案 0 :(得分:0)
我不知道保险库写入是否是同步的。
但是,您可以通过在保管库上创建一个observable来解决此问题,以便在记录新状态时通知您。这是我们使用其线性ID更新状态,然后等待与该线性ID匹配的保险库更新的示例:
grid.getEditorLock().commitCurrentEdit()