AnyLogic 汇编器作为网关

Posted

技术标签:

【中文标题】AnyLogic 汇编器作为网关【英文标题】:AnyLogic assembler as a gateway 【发布时间】:2017-02-11 07:51:03 【问题描述】:

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

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

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

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

有人可以帮助我了解如何实现此场景。

【问题讨论】:

【参考方案1】:

早上好,安德里亚。

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

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

我会使用 Wait 块(这几乎是一个 队列,但不会对元素进行排序,也不会在您需要之前将代理发送出去。阅读 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));

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

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

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

【讨论】:

感谢您的帮助。因此,如果我理解正确,我将在 assembler 元素之前用尽可能多的 wait 块替换所有 queues(每个必要对象一个)然后我会在新代理进入其中一个 wait 块时进行检查,然后在匹配成功时释放所有必要的对象。附言你能给我推荐一个文本或网络教程,我可以在其中学习一些程序块的基础知识吗? (我已经知道 Java 语言了) 是的,我想你已经理解了这个概念。程序块?你的意思是,如何使用 Anylogic 块?当我说“等待块”时,我指的是流程建模库中的等待元素! 使用“程序块”我的意思是一些关于如何在事件处理程序中编码的教程 不幸的是,我不知道任何专注于此的教程。但是,anylogic 帮助非常有用。此外,您还可以制作 Anylogic 随附的“Anylogic 三天内”PDF,您可以通过欢迎选项卡访问该 PDF。 在你的代码中谁拥有 WaitBlockHashMap?它是一个局部类变量吗?如果是,我如何以及在何处创建本地类变量?

以上是关于AnyLogic 汇编器作为网关的主要内容,如果未能解决你的问题,请参考以下文章

在任何逻辑中测量汇编程序中的时间,问题澄清

x86 汇编器:浮点比较

C指针原理-AT&T汇编

汇编器的NASM

为啥 Solaris 汇编器生成的机器代码与这里的 GNU 汇编器不同?

IDA使用初探-1.启动IDA