Как правильно реализовать планируемое состояние в корде

Я использую планируемое состояние, и мое состояние имеет метод ниже,

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)
    }
}
Другие вопросы по тегам