在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
。