【发布时间】:2020-07-20 15:09:17
【问题描述】:
阅读 Corda 的文档后,我认为在排水模式被禁用之前,排水模式不应该允许在节点上启动任何流。然而似乎并非如此,至少当我从 ServiceHub 运行我的流时。这是我尝试过的:
我使用 deployNodes 任务运行我的 cordapp。在 corda shell 中,我运行run setFlowsDrainingModeEnabled enabled: true。然后我通过 ServiceHub 运行一个流程,该流程更新该节点中的现有状态,并且在不排空节点的情况下,我查询 vault 并看到状态已成功更新。所以我真的很困惑。排水实际上是如何工作的?
我真正想要实现的是创建一个小实用程序来安全关闭节点,或者在尝试一段时间后失败。这是代码:
class ShutdownOrFailHelper {
private val sleepInterval = 1_000L
private val maxSleepTimes = 120
private var count = 0
fun run(args: Array<String>) {
val connection = RPCConnector().connect(args)
val proxy = connection.proxy
val nodeInfo = proxy.nodeInfo()
proxy.setFlowsDrainingModeEnabled(true)
do {
val pendingSize = proxy.stateMachinesSnapshot().size
if(pendingSize == 0){
proxy.shutdown()
println("Done")
break
}
Thread.sleep(sleepInterval)
count++
println("$pendingSize flows are running. Waiting flows to finish on $nodeInfo")
if(count > maxSleepTimes){
println("Node still has $pendingSize flows running. Give up waiting..")
proxy.setFlowsDrainingModeEnabled(false)
connection.notifyServerAndClose()
exitProcess(1)
}
} while (pendingSize != 0)
}}
但要使其正常工作,我需要确保在 proxy.setFlowsDrainingModeEnabled(true) 之后无法启动更多流,但实际上即使在此之后我也能够启动流。然后我真的不明白排水模式的目的是什么......
【问题讨论】:
标签: corda