Anylogic - 内部错误:引擎仍然安排了x个事件:xyz:[null]

问题描述 投票:0回答:1

停止我的模拟后,偶尔会收到以下错误消息:

例:

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)
...

我的模拟模型如下:Simulation Model with 5 Machines

该模型是作业车间调度问题的模拟,并执行以下操作:

  1. 通过源块中的inject(20)生成作业代理
  2. 作业转到数据库定义的机器并在等待块中等待
  3. 其他代理将作业从等待块中释放出来
  4. 作业在服务块中处理
  5. 这些工作又重复了4次

在步骤3中总共有5个代理 - 让我们称之为调度代理 - 他们使用Wait.free()方法来设置代理免费。一个代理控制一个等待块。所有5个调度代理同时工作,并通过Main代理同步(Main通知调度代理)。模拟开始后,保持块立即被解锁。它们也存在用于同步目的。每个调度代理都拥有自己的线程,该线程通过Thread.start()由在Main中定义的超时事件(发生一次,时间= 0)启动。

来自调度代理的线程看起来像这样:

new Thread(new Runnable() {
    public void run() {
        synchronized (sync_obj) {
            sync_obj.waituntilJobarrives();
            sync_obj.Waitblock.free(a_Job);
            synv_obj.waituntilJobisfinished();
            repeat();
        }
    }
});

现在我的问题是:当我开始模拟时,作业会正常生成并移动到指定的等待块。之后,调度代理开始工作并释放Job,但有时Scheduling Agent调用Waitblock.free()方法并且Job没有被释放(调用方法时用traceln()检查)。为了仔细检查问题,我实现了按钮,手动调用Waitblock.free()方法,但作业代理仍然不会离开等待块。如果代理没有释放作业,那么作业车间的模拟就会停留在那里。模拟继续运行,但20个作业从未完成,并且没有显示错误消息(技术上没有错误)。仅在停止模拟后,控制台中才会显示上面显示的错误消息。

更糟糕的是,这个错误不会一直出现。有时模拟工作正常,有时候等待块会停止反应。通常,在模拟足够长时间后会出现此错误,并且一个或多个等待块停止反应。

我从阅读错误消息的猜测是,引擎收到命令以从等待块中释放代理。它现在不会这样做。我如何或可以控制引擎(个人学习版)安排的事件顺序?或者还有另一种解决问题的方法吗?

我很感激任何帮助!

编辑:通过删除Hold-blockEngine still has X events scheduled的错误似乎不经常出现。但是'Wait-Block'仍然没有响应Waitblock.free()method并且控制台中出现以下错误消息:

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)

这看起来更像是一个常见的错误,我可以抓住它,我当前的解决方法是在Thread周围使用try和catch块调用Waitblock.free()方法并重新启动仿真,并保存在excel文件中的模拟进度。

error-handling runtimeexception anylogic
1个回答
0
投票

我会告诉你我的想法,但信息可能不足以得出结论:

我记得当我暂停模拟然后移除代理然后停止模拟时,我收到此错误。如果我按照这些步骤,我会得到错误...

这意味着当您停止模拟时,您需要为模拟提供至少一毫秒的时间才能完成预定的事件...在这种情况下,您的预定事件在线程上。因此,解决方法是在单击停止按钮之前使用finishSimulation()停止模拟。你必须在finishSimulation()函数运行之前杀死线程......我不确定这一点,但试一试。

这是第一个问题......我认为第二个问题与等待后的保持有关。请注意,如果您的保留块被阻止,并且您尝试从等待块中释放多个代理程序...当您取消阻止保留时,将只释放1个代理程序。这是因为在等待块的出口处只有1个代理的空间...如果你犯了这个错误,代理将永远留在等待块中。解决方案是在等待块之后使用队列。我不认为这个问题与你得到的错误有关......

© www.soinside.com 2019 - 2024. All rights reserved.