如何将Agent从Wait块调度至对应订单的目标生产线?
多生产线场景下Wait块定向释放Agent的实现方案
给Agent加目标生产线标记
在你的Agent对象里新增一个属性,要么用int targetLineId存生产线编号,要么直接用Enter targetEnterBlock存对应生产线的Enter块实例(后者更靠谱,不容易写错编号)。生成订单的时候,直接给这个属性赋值——比如订单对应生产线1,就设agent.targetLineId = 1,或者直接把enterLine1这个实例赋值给agent.targetEnterBlock。修改Wait块的释放逻辑
先把Wait块的输出连接删掉,避免自动发送冲突。然后在Wait块的On release事件里写代码:// 用编号匹配的写法 if(targetLineId == 1) { enterLine1.take(this); } else if(targetLineId == 2) { enterLine2.take(this); } // 直接关联Enter块实例的写法(更推荐) // targetEnterBlock.take(this);这段代码的作用是,Agent从Wait块释放时,主动调用目标Enter块的
take()方法,自己走过去。JIT释放逻辑适配
你原来的JIT释放代码(比如触发释放指定Agent的逻辑)不用大改,找到要释放的Agent后调用waitBlock.release(agent)就行,Agent会自动执行上面的On release代码,精准走到对应生产线。多生产线简化写法
如果生产线数量多,不想写一堆if-else,可以先把所有生产线的Enter块放进一个集合:// 在主Agent里定义集合(比如Startup事件里初始化) List<Enter> lineEnters = Arrays.asList(enterLine1, enterLine2, enterLine3);然后Agent的
On release事件里直接写:lineEnters.get(targetLineId - 1).take(this);注意这里
targetLineId要从1开始对应集合的索引0。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

