AnyLogic汇编程序作为网关

时间:2016-10-03 11:21:02

标签: java anylogic

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

我的图表将由'"'''元素和不同的汇编程序''元素,我希望最后的(汇编程序)作为网关。我附上一个简单的图表来更好地说明情况(example)

假设'' sourceA''和' sourceB'' (放置在不同的部门)生成两个不同的文档,用两个自定义代理实现(例如,来自' sourceA''' orderID' '''''''''''参数和代理商在''''''到达汇编程序组件(放在不同的部门)之前的相应队列。具有高概率的队列在模拟期间未对齐(队列[10] = agent.orderID设置为10并且队列[10] = agent.qualityIDCheck设置为9)因为部门未同步。我希望汇编程序作为一个网关工作,以便它等待具有' orderID'''等于' qualityCheckID'' (这意味着特定订单上的产品已经过质量部门的验证)。

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

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

1 个答案:

答案 0 :(得分:1)

早上好安德烈。

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

但是,如果ID是随机生成的,您可能需要进行某种解决方法并使用Java代码和函数。 我会做的如下:

我没有使用队列(一旦下一个块可用就将代理发送出去),而是使用等待块(这几乎是< strong>队列但是没有订购元素,也没有将代理发送出去,直到你需要它。阅读AnyLogic上的描述,这将是明确的。)

每当代理进入等待阻止时,我会将其添加到带有整数(或您的类型)的 LinkedHashMap HashMap 集合中order parameter)key和Agent值(每个Wait Block一个)。这将允许更容易的信息访问(而不是每次我想检查特定代理是否在那里时搜索整个Wait内容)。 下一步是简单地检查在另一个Wait Block上是否有我需要执行组装任务的元素。如果是这样,请将它们全部释放(和当前代理)。

代码如下:

输入:

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));
}

取决于等待阻止中的代理类型。

我希望这有用, 路易斯