Переменная планирования — это ресурс, который назначается задаче с конечно, зернистый временной диапазон. Когда назначен временной интервал, мне нужно вычислить «фактический» временной диапазон. Это получено из временного интервала и дополнительных полей задачи, которые говорят мне, как вычислить «фактический» диапазон времени.
У нас был, как мы думали, работающий прослушиватель переменных, но после включения TRACKED_FULL_ASSERT Я вижу эту ошибку, когда начинается решение:
Код: Выделить всё
java.lang.IllegalStateException: VariableListener corruption after completedAction (Initial score calculated):
The entity (Task() assigned to TimeSlot(2024-07-07T08:59:49.956Z to 2024-07-07T09:10:36.337Z: duration PT10M46.381S))'s shadow variable (Task.actualStartTime)'s corrupted value (2024-07-07T18:09:49.927Z) changed to uncorrupted value (2024-07-07T09:00:22.500Z) after all variable listeners were triggered without changes to the genuine variables.
Моя задача ПланированиеEntity:
Код: Выделить всё
@PlanningVariable(valueRangeProviderRefs = "timeslotRange", allowsUnassigned = true)
private TimeSlot timeslot = null;
private Instant actualStartTime = null;
@ShadowVariable(
sourceVariableName = "timeslot",
variableListenerClass = TimeSlotStartTimeListener.class)
public Instant getActualStartTime() {
return this.actualStartTime;
}
private Instant actualEndTime = null;
@PiggybackShadowVariable(shadowVariableName = "actualStartTime")
public Instant getActualEndTime() {
return this.actualEndTime;
}
Код: Выделить всё
@Override
public boolean requiresUniqueEntityEvents() { // No idea if this is needed.
return true;
}
private void updateStartAndEndTimes(ScoreDirector scoreDirector, Task task) {
scoreDirector.beforeVariableChanged(task, "actualStartTime");
task.setActualStartTime(someStartTimeMath(task)); // Cant show the actual logic here, but it's a pure function.
scoreDirector.afterVariableChanged(task, "actualStartTime");
scoreDirector.beforeVariableChanged(task, "actualEndTime");
task.setActualEndTime(someEndTimeMath(task));
scoreDirector.afterVariableChanged(task, "actualEndTime");
}
@Override
public void beforeVariableChanged(ScoreDirector scoreDirector, Task task) {
this.updateStartAndEndTimes(scoreDirector, task);
}
@Override
public void afterVariableChanged(ScoreDirector scoreDirector, Task task) {
this.updateStartAndEndTimes(scoreDirector, task);
}
Обновление 1:
Я заплатил немного более пристальное внимание к значениям, которые вызывают возникновение исключений. Похоже, что теневые значения фактическогоStartTime и фактическогоEndTime просто не такие, какими они должны быть.
Итак, с неинициализированным решением это не так. проблема. Это проблема только тогда, когда я возвращаюсь, чтобы решить ее заново. Итак, теперь я пытаюсь выяснить, что может вызвать недопустимые значения. Код обновления прослушивателя на самом деле ничего не меняет и не имеет состояния. Так что я очень озадачен тем, как это могло произойти.
Что для меня, скорее всего, означает, что результат прослушивателя кэшируется, а некоторые как используются различными задачами/значениями. Доказательств этому пока нет, но различия похожи на фактические теневые значения других задач.
Подробнее здесь: https://stackoverflow.com/questions/786 ... alculation
Мобильная версия