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

在corda中实现可调度状态的正确方法是什么,corda,Corda,我使用可调度状态,我的状态有以下方法 override fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity? { System.out.println("inside scheduled activity " ) val scheduledAt = Instant.now().plusSeconds(10)

我使用可调度状态,我的状态有以下方法

override fun nextScheduledActivity(thisStateRef: StateRef, flowLogicRefFactory: FlowLogicRefFactory): ScheduledActivity? {

  System.out.println("inside scheduled activity " )
    val scheduledAt = Instant.now().plusSeconds(10)
    val logicRef = flowLogicRefFactory.create(SFlow::class.java, thisStateRef)
    var toReturn: ScheduledActivity? = ScheduledActivity(logicRef, scheduledAt)

    return toReturn
}

我的SFLow标记为@initiatingflow、@SchedulableFlow。但是我没有让这个流程运行。每隔10秒,我就会看到这个打印语句“在计划活动内”。不确定这里出了什么问题…

节点有一个订阅添加到vault的新状态提要的
ScheduledActivityObserver
。每当向vault添加新状态时:

  • 观察者检查状态是否为
    SchedulableState
  • 如果状态为
    SchedulableState
    ,则观察者调用
    nextScheduledActivity
    ,以确定未来运行计划活动的时间点,并将计划活动添加到其计划中
  • 一旦到达该未来时间点,观察者再次调用
    nextScheduledActivity
    以检索计划的活动和计划的活动应该发生的时间点

    • 如果时间点在过去,观察者将运行计划的活动
    • 如果时间点现在是在未来,观察者会认为计划的活动已被重新安排,并将其重新安排到该未来时间点
在您的情况下,
nextScheduledActivity
通过调用
Instant.now().plusSeconds(10)
查找计划活动的时间点。因为每次调用<代码> NEXPROTEDATABASE 时,这个表达式都会被重新计算,所以观察者总是认为这个活动在未来被重新安排为十秒,并且永远不会运行它。 相反,您需要评估时间点,以便在状态创建时一次性运行计划的活动。例如:

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)
    }
}

谢谢,乔尔,成功了。顺便说一下,我看到scheduledactivity只被调用一次。有没有一种方法可以使用ScheduledActivity执行重复性任务?不是直接执行。相反,您必须在由第一个
ScheduledActivity
启动的流中创建另一个
SchedulableState