前页 | 后页 |
信号事件
信号事件提供了通过发布-订阅集成来松散耦合“投掷者”和“捕手”的功能。 “投掷者”将广播信号,而不是将其寻址到特定进程。侦听该特定事件的任何进程都可以使用信号启动事件来触发新实例。
信号可以从引发的中间事件或引发的结束事件中引发,并且可以捕获在开始事件或捕获的中间事件(包括边界信号事件)中。
在此示例中,我们通过BPSim参数设置演示了这些信号事件及其对任务生命线的影响。
- 启动信号事件:
-在顶级进程(Pool1)中按Signal1启动
- 由Signal2开始在事件子流程eventSubProcess2中中断
- 从Signal1开始在事件子流程eventSubprocess1中不中断
- 投掷中间信号事件:
- 广播信号1
- 捕获中间信号事件:
- 接收信号1(正常)
- 接收信号2(正常)
- 接收信号2(边界中断)
- 接收信号1(边界无中断)
- 接收Signal2(在事件网关中)
- 结束信号事件:
- 结束时抛出Signal2
创建BPMN模型
为了演示通过信号事件跨进程进行通信的能力,我们创建了一个协作模型,其中包含一个主池和另一个池中的一个进程( Pool1 )。
创建协作和主要流程
创建一个名为CollaborationForTestingSignalEvents的新BPMN2.0协作图(选择选项'在新的Collaboration Model中创建此图')。右键单击浏览器窗口中的图名称,然后选择“封装过程”选项。
创建一个Pool PoolMain和一个流程BusinessProcess_PoolMain ,并使用自动值设置这些标记:
- CollaborationForTestingSignalEvents.mainPool设置为PoolMain
- PoolMain.processRef设置为BusinessProcess_PoolMain
为主要流程创建元素
创建一个开始事件S1并将序列流添加到Fork并行网关parallelFork
将序列流添加到:
- 抽象任务Task1(20) ,然后添加此序列流链:
-到抛出中间信号事件广播Signal1
-然后进入抽象任务Task2(10)
-然后转到捕获中间信号事件接收Signal2(正常)
-然后是抽象任务Task3(20)
-然后到合并并行网关parallelMerge
-然后到结束事件E1
- 抽象任务Task4(10) ,然后添加以下序列流链:
-到捕获中间信号事件接收Signal1(正常)
-然后转到抽象任务Task5(100),在其上创建边界中断捕获
中间信号事件接收信号2(边界中断)
-然后进入抽象任务Task6(10)
-然后到较早的Merge Parallel Gateway parallelMerge
- 抽象任务Task7(30) ,然后添加以下序列流链:
-到抽象任务Task8(5)
-然后到较早的Merge Parallel Gateway parallelMerge
- 捕获中间信号事件接收Signal2(在事件网关中),然后此序列流链:
-到抽象任务Task9(10)
-然后到较早的Merge Parallel Gateway parallelMerge
- 捕获中间计时器事件等待(25) ,然后此序列流链:
-抽象任务Task10(10)
-然后到结束事件E2
在主流程中创建一个事件子流程(由不间断的启动信号事件触发)
- 创建一个活动eventSubProcess1 ,然后在其“属性”对话框中,将“类型”字段设置为subProcess并将属性“ triggeredByEvent”更改为true
- 在eventSubProcess1中,创建一个由Signal1不间断启动的开始事件,并在其“属性”对话框中,将“类型”字段设置为“ 事件子过程 不间断 ” >“信号”
- 将序列流添加到目标摘要任务Task11(20)
- 将序列流添加到目标结束事件( 通过抛出Signal2结束) ,然后在元素“属性”对话框中,将“类型”字段设置为Signal
创建另一个过程
- 从工具箱中,将“ Pool”图标拖放到图上,并将元素命名为Pool1
- 在“浏览器”窗口中的Pool1上单击鼠标右键,然后选择“封装过程”选项;创建流程BusinessProcess_Pool1并将标记“ Pool1.processRef”设置为BusinessProcess_Pool1
创建 Pool1 的主要过程
- 创建一个信号开始事件, 以Signal1开始
- 将序列流添加到目标抽象任务Task12(100)
- 将序列流添加到目标结束事件E3
创建一个事件子进程来中断 Pool1
- 创建一个活动eventSubProcess1 ,然后在“属性”对话框中,将“类型”字段设置为subProcess ;将属性“ triggeredByEvent”更改为true
- 在eventSubProcess2中,创建一个由Signal2中断开始的启动事件,然后在“属性”对话框中,将“类型”字段设置为“ 事件子进程中断>信号”
- 将序列流添加到目标摘要任务Task13(10)
- 将序列流添加到目标结束事件E4
创建BPMN2.0信号元素并配置信号事件
在BPMN 2.0工具箱中,展开“ BPMN 2.0-类型”页面,并将“信号”图标拖到图上;将元素命名为Signal1 。再次将图标拖到图表上以创建Signal2 。这些是根元素(所有进程都可以使用),因此可以直接在模型Package下创建它们。
双击每个Signal Event元素,然后在'signalRef'标签的'Value'字段中,单击按钮并浏览到适当的Signal元素。
提示:或者,您可以从浏览器窗口中拖动Signal元素,并将其放在图中的Event元素上;显示上下文菜单,从中可以选择“设置signalRef”选项。
- 将signalRef设置为“ Signal1”:
- 广播信号1
-在顶级进程( Pool1 )中由Signal1启动
- 从Signal1开始,在事件子流程eventSubprocess1中 不中断
- 接收信号1(正常)
- 接收信号1(边界无中断)
- 将signalRef设置为“ Signal2”:
- 通过Signal2开始在事件子流程eventSubProcess2中 中断
- 接收信号2(正常)
- 接收信号2(边界中断)
- 接收Signal2(在事件网关中)
配置BPSim
在本节中,我们将创建配置工件,指定模型Package并配置每个元素的参数值。
该配置非常简单,因为任何信号事件都不需要任何BPSim配置。我们要做的就是设置任务的处理时间,以便我们观察进程,线程和任务如何启动和中断。
任务 |
描述 |
---|---|
设置配置 |
|
非信号事件 |
|
虚拟变量的过程 |
模拟控制器显示一个列表,该列表显示每个元素的运行时令牌计数。例如,在模拟中,有4个令牌已通过网关元素parallelMerge 。这对于某些统计和分析非常有用。但是,它不显示仿真期间何时遍历了parallelMerge 。为了获得单个令牌的准确跟踪,我们使用属性跟踪实用程序,该实用程序依赖于属性参数。因此,我们创建了一个虚拟参数。 在“配置BPSim”对话框中,展开“业务流程”组。
|
任务处理时间 |
展开“活动”组,然后为此处列出的每个任务元素:选择“时间”选项卡,单击“新参数”下拉箭头并选择“ ProcessingTime”,然后单击“值”列上的按钮,选择“常数”和“数值”,在“常数数值”字段中输入所指示的值,然后在“ TimeUnit”字段中选择“ seconds”。
|
运行模拟
- 在“配置BPSim”对话框工具栏上,单击“运行”图标以打开“ BPSim Simulation Controller”对话框
- 单击“运行”图标下拉箭头,然后选择“标准模拟”
- 模拟后,单击工具栏上的按钮以显示“ BPSim PropertyParameter Values”对话框
- 单击查询按钮,然后单击“按属性分组”选项卡,然后展开“ dummyVariable”
分析
从模拟的直接结果来看,发生的事情可能并不明显。但是,如果我们为每项任务画出生命线,那就很清楚了。
- Task1,Task4和Task7并行启动
- TASK2立即开始任务1完成(而不在投掷时停止)后
- 在20秒时, Signal1由Throwing Intermediate Event Broadcast Signal1广播,并且:
- 接收信号1(正常)已激活, 任务5已启动
- 通过信号1启动不间断并激活eventSubProcess1中的 Task11
-激活了“ 按信号1启动”并且对Pool1中的Task12进行了设置
- 在40秒时, Signal2在End Event End By Throwing Signal2中广播,并且:
- 接收信号2(正常)被激活,开始任务3
-Task5被中断, Task6开始
-激活了接收信号2(在事件网关中),并启动了Task9
- 通过信号2中断启动已激活,并且:
> Pool1中的主进程被中断, Task12已停止
> eventSubProcess2中的 Task13已启动
- 在50秒到达E4时, BusinessProcess_Pool1中的eventSubProcess2完成
- 在60秒到达E1时, BusinessProcess_MainPool完成
- 由于首先激活了网关中的信号事件,所以未激活中间计时器事件等待(25) 。结果, Task10从未启动
注意:每个任务的实际运行时间可以从生成的BPSimReport元素中观察到,方法是:
- 双击<< BPSimReport >>元素。
- 扩展“时间”组。
- 扩展任务元素。
- 检查“任务总时间”。