早上好,
我是AnyLogic平台的新手,因为我想用它来绘制公司的业务流程,所以我开始研究它。我计划使用该工具的过程模型库来对不同部门建模,以研究现在如何实现部门之间的信息流。

我的图将由“源”元素和不同的“汇编器”元素组成,我希望最后一个(汇编器)充当网关。我附上一个简单的图表,以更好地说明(example)的情况。

假设“sourceA”和“sourceB”(放置在不同部门中)生成了两个不同的文档,这些文档是通过两个自定义代理实现的(例如,从“sourceA”生成的代理具有“orderID”参数,而从“sourceB”具有“qualityCheckID”参数),该参数在到达汇编器组件(位于不同部门)之前在相应的队列中传送。由于部门未同步,因此在模拟期间未将队列对齐的可能性很高(queue [10] = agent.orderID设置为10,queue [10] = agent.qualityIDCheck设置为9)。我希望汇编器充当网关,因此它等待具有“orderID”等于“qualityCheckID”的代理(这意味着特定订单上的产品已由质量部门验证)。

阅读文档后,我发现代理在空闲时到达汇编器端口,否则在队列中等待。由于可能发生异步,因此在汇编器端口中存在的代理的orderID不等于qualityCheckID,在这种情况下,我不希望产生汇编器的输出。可能会发生必要的代理位于队列中而不是端口中的情况,因此“汇编器”必须在队列内部进行搜索,以查找是否存在相应的代理,以及是否将其从队列中删除(将错误的代理替换为队列中的错误代理)。端口,将最后一个进入队列并产生输出)

有人可以帮助我了解如何实现此方案。

最佳答案

早上好,安德里亚。

有一些替代方法。
如果两个ID都是增量生成的(1、2、3,...,N),则可以使用Match块,它将使您的流程同步。另外,您可以删除队列元素,因为此块已包含队列。

但是,如果ID是随机生成的,则可能需要做一些变通方法并使用Java代码和函数。
我将要做的事情如下:

而不是使用队列(在下一个块可用时立即将代理发送出去),我将使用 Wait 块(这几乎是队列,但不对元素进行排序也不发送代理直到您需要为止。请阅读AnyLogic上的说明,这样会很清楚。

每当代理输入等待块时,我都会将其添加到带有整数(或订单参数类型)键和代理值(每个等待块一个)的 LinkedHashMap HashMap 集合中。这将使信息访问更加容易(而不是每次我想检查特定的代理是否都在其中搜索整个Wait内容时)。
下一步将是简单地检查其他“等待块”上是否存在执行组装任务所需的元素。如果是这样,则将它们全部释放(并释放当前代理)。

代码如下:

输入时:

WaitBlockHashMap.put(agent.orderID, agent)
if (WaitBlockHashMap2.get(agent.orderID)!=null) { //if the matching element
                                                  //is on the other Wait Block
    self.free(agent);
    WaitBlock2.free(WaitBlockHashMap2.get(agent.orderID));
}

要么
WaitBlockHashMap.put(agent.qualityCheckID, agent)
if (WaitBlockHashMap2.get(agent.qualityCheckID)!=null) { //if the matching element
                                                         //is on the other Wait Block
    self.free(agent);
    WaitBlock2.free(WaitBlockHashMap2.get(agent.qualityCheckID));
}

取决于该中的代理程序类型等待块。

我希望这会有所帮助,
路易斯

关于java - AnyLogic汇编器作为网关,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39830403/

10-10 19:48