Как правильно реализовать планируемое состояние в корде
Я использую планируемое состояние, и мое состояние имеет метод ниже,
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 помечен @IntitiatingFLow, @SchedulableFlow. Но я не запускаю этот поток. Каждые 10 секунд я вижу это заявление о печати "внутри запланированной деятельности". Не уверен, что здесь не так...
1 ответ
Узел имеет ScheduledActivityObserver
который подписывается на ленту новых состояний, добавленных в хранилище. Всякий раз, когда новое состояние добавляется в хранилище:
- Наблюдатель проверяет, является ли государство
SchedulableState
- Если государство
SchedulableState
Наблюдатель вызываетnextScheduledActivity
установить, в какой момент времени выполнять запланированные действия, и добавить запланированное действие в свое расписание Как только этот будущий момент времени достигнут, наблюдатель вызывает
nextScheduledActivity
снова, чтобы извлечь запланированное действие и момент времени, когда запланированное действие должно произойти- Если момент времени в прошлом, наблюдатель запускает запланированное действие
- Если момент времени уже наступил, наблюдатель считает, что запланированное мероприятие было перенесено, и перепланирует его на этот будущий момент времени.
В твоем случае, nextScheduledActivity
находит момент времени для запланированной деятельности, вызывая Instant.now().plusSeconds(10)
, Поскольку это выражение переоценивается каждый раз, когда вы звоните nextScheduledActivity
наблюдатель всегда будет считать, что это действие перенесено на десять секунд в будущем, и никогда не будет запускать его.
Вместо этого вам необходимо оценить момент времени, чтобы раз и навсегда выполнить запланированное действие во время создания состояния. Например:
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)
}
}