首页 文章

AnyLogic汇编程序作为网关

提问于
浏览
3

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

我的图表将由''source' ' elements and different ' 'assembler''元素组成,我希望最后的(汇编程序)作为网关 . 我附上一个简单的图表来更好地说明情况(example) .

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

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

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

1 回答

  • 1

    安德烈,早上好 .

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

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

    而不是使用 Queue (一旦下一个块可用就将代理发送出去),我会使用 Wait 块(这几乎是 Queue 但是没有订购元素,也没有将代理发送出去,直到你需要它为止 . 阅读AnyLogic上的描述,这将很清楚) .

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

    取决于 Wait 块中的代理类型 .

    我希望这很有帮助,路易斯

相关问题