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