Java 作为网关的任意逻辑汇编程序

Java 作为网关的任意逻辑汇编程序,java,anylogic,Java,Anylogic,早上好, 我是AnyLogic平台的新手,我开始研究它,因为我想用它来描绘公司的业务流程。我计划使用该工具的流程模型库对不同的部门进行建模,目的是研究现在如何实现部门之间的信息流 我的图表将由“源”元素和不同的“汇编器”元素组成,我希望最后的元素(汇编器)可以作为网关工作。为了更好地说明情况,我附上一张简单的图表 假设“sourceA”和“sourceB”(位于不同的部门)生成两个不同的文档,并使用两个自定义代理实现(例如,从“sourceA”生成的代理具有“orderID”参数,从“sourc

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

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

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

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

有人可以帮助我理解这个场景是如何实现的。

早上好,Andrea

有一些替代方案。 如果两个ID都是增量生成的(1,2,3,…,N),您可以使用匹配块,它将同步您的流。此外,您还可以删除队列元素,因为此块已经合并了队列

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

我不使用队列(它在下一个块可用时立即发送代理),而是使用等待块(它几乎是一个队列,但不对元素排序,也不发送代理,直到您需要它为止。阅读AnyLogic上的描述,它就会很清楚)

每当代理输入Wait块时,我都会将其添加到LinkedHashMapHashMap集合中,其中包含整数(或订单参数的类型)键和代理值(每个等待块一个)。这样可以更方便地访问信息(而不是每次我想检查是否有特定的代理时都搜索整个等待内容)。 下一步是简单地检查其他等待块上是否有执行组装任务所需的元素。如果是这样,请释放所有代理(以及当前代理)

代码如下:

进入时:

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

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

我真的希望这会有帮助,
谢谢你的帮助。因此,如果我理解正确,我将在汇编器元素之前用尽可能多的等待块(每个必要的对象一个)替换所有队列,然后每当新代理进入其中一个等待块时,我将进行检查,然后在匹配成功时释放所有必要的对象。另外,你能给我推荐一篇课文或一篇网络教程,让我学习一些程序块的基础知识吗?(我已经知道Java语言)是的,我想你已经理解了这个概念。程序块?你是说,如何使用Anylogic块?当我说“Wait Block”时,我指的是流程建模库中的Wait元素!关于“程序块”,我指的是一些关于如何在事件句柄中编码的教程。幸运的是,我不知道有哪一个教程关注这个问题。但是,anylogic帮助非常有用。此外,您还可以使用Anylogic附带的“Anylogic in three days”PDF,您可以通过“欢迎”选项卡访问该PDF。在您的代码中,谁拥有WaitBlockHashMap?它是一个局部类变量?如果是,如何以及在何处创建局部类变量?
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));
}