在Corda中实现可调度状态的正确方法是什么

时间:2018-10-30 03:01:48

标签: corda

我正在使用可调度状态,并且我的状态具有以下方法,

eval

我的SFLow被标记为@ IntitiatingFLow,@ SchedulableFlow。但是我没有让这个流程运行。每隔10秒钟,我会看到此打印声明“计划内活动” 。不知道这里出了什么问题...

1 个答案:

答案 0 :(得分:1)

该节点有一个ScheduledActivityObserver,用于订阅添加到保管库的新状态的提要。每当将新状态添加到Vault中时:

  • 观察者检查状态是否为SchedulableState
  • 如果状态为SchedulableState,那么观察者会调用nextScheduledActivity来确定在哪个未来时间点运行计划的活动,并将计划的活动添加到其计划中
  • 一旦到达此将来的时间点,观察者再次呼叫nextScheduledActivity ,以检索计划的活动以及应该发生计划的活动的时间点< / p>

    • 如果时间是过去的时间,则观察者将运行计划的活动
    • 如果该时间点现在是将来的某个时间,则观察者会认为已计划的活动已重新安排,并在该将来的时间点对其进行了重新安排

在您的情况下,nextScheduledActivity通过致电Instant.now().plusSeconds(10)来找到计划活动的时间点。由于每次调用nextScheduledActivity时都会重新表达此表达式,因此观察者将始终认为该活动已被重新安排为将来的10秒,并且永远不会运行。

相反,您需要评估时间点,以在状态创建时彻底运行计划的活动。例如:

class HeartState(
        private val me: Party,
        private val nextActivityTime: Instant = Instant.now().plusSeconds(1)
) : SchedulableState {

    override val participants get() = listOf(me)

    override fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity? {
        val flowLogicRef = flowLogicRefFactory.create(HeartbeatFlow::class.java, thisStateRef)
        ScheduledActivity(flowLogicRef, nextActivityTime)
    }
}