AnyLogic 汇编程序作为网关

AnyLogic assembler as a gateway

早上好, 我是 AnyLogic 平台的新手,我已经开始研究它,因为我想用它来映射公司的业务流程。我打算使用该工具的流程模型库对不同部门进行建模,目的是研究现在如何实现部门之间的信息流。

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

假设''sourceA''和''sourceB''(放置在不同的部门)生成两个不同的文档,用两个自定义代理实现(例如从''sourceA''生成的代理有一个“'orderID'”参数和从“'sourceB'”生成的代理有一个“'qualityCheckID'”参数)在到达组装器组件(放置在不同的部门)之前在各自的队列上传送.队列在模拟过程中很可能没有对齐(queue[10] = agent.orderID 设置为 10,queue[10] = agent.qualityIDCheck 设置为 9)因为部门不同步.我希望汇编器作为网关工作,因此它等待“'orderID'”等于“'qualityCheckID'”的代理(这意味着特定订单上的产品已经过质量部门的验证).

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

有人可以帮助我了解如何实现这种情况。

早上好,安德里亚。

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

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

而不是使用 Queue(一旦下一个块可用就发送代理)我会使用 Wait块(这几乎是一个 Queue 但不会对元素进行排序,也不会在您需要之前发送代理。阅读 AnyLogic 上的描述,它会很清楚)。

每当代理进入 Wait 块时,我会将其添加到 LinkedHashMapHashMap 带有整数(或您的订单参数的类型)键和代理值(每个等待块一个)的集合。这将允许更容易的信息访问(而不是每次我想检查特定代理是否存在时搜索整个 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));
}

取决于那个等待块中的代理类型。

希望对您有所帮助, 路易斯