После остановки симуляции я иногда получаю следующее сообщение об ошибке:
Пример:
Exception during stopping the engine:
INTERNAL ERROR(S):
Engine still has 6 events scheduled: 2386.0: [null]
java.lang.RuntimeException: INTERNAL ERROR(S):
Engine still has 6 events scheduled: 2386.0: [null]
at com.anylogic.engine.Engine.g(Unknown Source)
at com.anylogic.engine.Engine.stop(Unknown Source)
at com.anylogic.engine.ExperimentSimulation.stop(Unknown Source)
at com.anylogic.engine.gui.ExperimentHost.executeCommand(Unknown Source)
at com.anylogic.engine.internal.webserver.l.onCommand(Unknown Source)
...
Моя имитационная модель выглядит так: Имитационная модель с 5 машинами
Модель моделирует проблему планирования работы магазина и выполняет следующие действия:
- Генерирует агентов заданий с помощью
inject(20)
в исходном блоке - Заданияперейти к компьютеру, заданному базой данных, и ждать в блоке ожидания
- Задания освобождаются от блока ожидания другими агентами
- Задания обрабатываются в сервисном блоке
- Задания повторяют процесс еще 4 раза
На шаге 3 всего 5 агентов - давайте назовем их Агент планирования - и они используют метод Wait.free()
освободить агентов.Один агент контролирует один блок ожидания.Все 5 агентов планирования работают одновременно и синхронизируются через агента Main
(Main
уведомляет агентов планирования).Блокировки разблокируются сразу после начала симуляции.Они существуют также для целей синхронизации.Каждый агент планирования имеет свой собственный поток, который запускается через Thread.start()
событием тайм-аута (происходит один раз, время = 0), определенным в Main
.
Поток из агента планирования выглядит примерно так:
new Thread(new Runnable() {
public void run() {
synchronized (sync_obj) {
sync_obj.waituntilJobarrives();
sync_obj.Waitblock.free(a_Job);
synv_obj.waituntilJobisfinished();
repeat();
}
}
});
Теперь вот моя проблема: Когда я запускаю симуляцию, задания генерируются нормально и перемещаются в назначенный им блок ожидания.После этого агенты планирования начинают свою работу и освобождают задание, но иногда агент планирования вызывает метод Waitblock.free()
, и задание не освобождается (проверяется с помощью traceln()
при вызове метода),Чтобы дважды проверить проблему, я реализовал кнопки, которые вручную вызывают метод Waitblock.free()
, но Агенты заданий по-прежнему не покидают блок ожидания.Если агент не освобождает задание, симуляция магазина заданий застревает там.Симуляция продолжается, но 20 заданий никогда не завершаются, и сообщение об ошибке не отображается (технически ошибки нет).Только после остановки симуляции в консоли появляется сообщение об ошибке, показанное выше.
Хуже всего то, что эта ошибка не появляется постоянно.Иногда симуляция работает просто отлично, а иногда блок ожидания перестает реагировать.Обычно после достаточно длительного моделирования появляется эта ошибка, и один или несколько блоков ожидания перестают реагировать.
Мое предположение после прочтения сообщения об ошибке состоит в том, что движок получил приказ освободить агентов из блока ожидания.Это просто не будет сейчас .Как или я могу контролировать порядок событий, запланированных движком (Personal Learning Edition)?Или есть другой способ решения проблемы?
Я благодарен за любую помощь!
РЕДАКТИРОВАТЬ : При удалении Hold-block
, ошибка Engine still has X events scheduled
не появляется так часто.Но «Wait-Block» по-прежнему не отвечает на метод Waitblock.free()
, и в консоли появляется следующее сообщение об ошибке:
java.lang.RuntimeException: root.w_Warteblock1.readyEntities.output.readyNotificationAsync.event: negative timeout: -1.25
at com.anylogic.engine.Engine.error(Unknown Source)
at com.anylogic.engine.EventOriginator.g(Unknown Source)
at com.anylogic.engine.EventOriginator.c(Unknown Source)
at com.anylogic.engine.EventTimeout.restart(Unknown Source)
at com.anylogic.libraries.processmodeling.AsynchronousExecutor_xjal.a(Unknown Source)
at com.anylogic.libraries.processmodeling.OutputBlock.notifyReady(Unknown Source)
at com.anylogic.libraries.processmodeling.OutputBuffer.a(Unknown Source)
at com.anylogic.libraries.processmodeling.OutputBuffer.take(Unknown Source)
at com.anylogic.libraries.processmodeling.Wait.free(Unknown Source)
Это больше похоже на общую ошибку, которую я могу уловить так,Мой текущий обходной путь - блок try и catch вокруг Thread, который вызывает метод Waitblock.free()
и перезапуск симуляции с прогрессом симуляции, сохраненным в файле excel.