前页 后页

信号事件

信号事件提供了通过发布-订阅集成来松散耦合“投掷者”和“捕手”的功能。 “投掷者”将广播信号,而不是将其寻址到特定进程。侦听该特定事件的任何进程都可以使用信号启动事件来触发新实例。

信号可以从引发的中间事件或引发的结束事件中引发,并且可以捕获在开始事件或捕获的中间事件(包括边界信号事件)中。

在此示例中,我们通过BPSim参数设置演示了这些信号事件及其对任务生命线的影响。

  • 启动信号事件:
    -在顶级进程(Pool1)中按Signal1启动
    - 由Signal2开始在事件子流程eventSubProcess2中中断
         - 从Signal1开始在事件子流程eventSubprocess1中不中断
  • 投掷中间信号事件:
    - 广播信号1
  • 捕获中间信号事件:
    - 接收信号1(正常)
          - 接收信号2(正常)
          - 接收信号2(边界中断)
          - 接收信号1(边界无中断)
          - 接收Signal2(在事件网关中)
  • 结束信号事件:
    - 结束时抛出Signal2

创建BPMN模型

为了演示通过信号事件跨进程进行通信的能力,我们创建了一个协作模型,其中包含一个主池和另一个池中的一个进程( Pool1 )。

Collaboration diagram in Business Process Simulation in Sparx Systems Enterprise Architect

创建协作和主要流程

创建一个名为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
任务7(30)上 ,创建边界不间断捕获中间信号事件接收信号1(边界不间断) 。将序列流添加到事件网关eventGateway ,然后将序列流添加到:
  • 捕获中间信号事件接收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'字段中,单击Browse.按钮并浏览到适当的Signal元素。

提示:或者,您可以从浏览器窗口中拖动Signal元素,并将其放在图中的Event元素上;显示上下文菜单,从中可以选择“设置signalRef”选项。

  • 将signalRef设置为“ Signal1”:
    - 广播信号1
         -在顶级进程( Pool1 )中由Signal1启动
    - 从Signal1开始,在事件子流程eventSubprocess1中 不中断
          - 接收信号1(正常)
          - 接收信号1(边界无中断)
  • 将signalRef设置为“ Signal2”:
    - 通过Signal2开始在事件子流程eventSubProcess2中 中断
          - 接收信号2(正常)
          - 接收信号2(边界中断)
          - 接收Signal2(在事件网关中)

配置BPSim

在本节中,我们将创建配置工件,指定模型Package并配置每个元素的参数值。

该配置非常简单,因为任何信号事件都不需要任何BPSim配置。我们要做的就是设置任务的处理时间,以便我们观察进程,线程和任务如何启动和中断。

任务

描述

设置配置

  • 打开“配置BPSim”窗口(“模拟>过程分析> BPSim>打开BPSim Manager”)
  • 创建一个名为“ SignalEvent Complete Example”的工件(在“ Select / Create Artifact”字段中,单击Browse.按钮并选择其父包,然后单击Add New按钮,然后键入元素名称并单击Save按钮和确定按钮)
然后,所有BPMN元素都将被加载到“配置BPSim”窗口中。

非信号事件

  • 在对话框左侧的元素列表中,展开“ StartEvent”组,然后单击S1和“ Control”选项卡上;单击“新参数”下拉箭头,然后选择“触发计数”,然后在“值”字段中键入“ 1”
  • 展开“ IntermediateEvent”组,然后单击“ 等待”(25)和“控制”选项卡上;单击“新参数”下拉箭头并选择“ InterTriggerTimer”,然后单击“值”字段中的Browse.按钮;选择“常数”和“数值”,然后在“常数数值”字段中键入“ 25”,在“ TimeUnit”字段中键入“ seconds”

虚拟变量的过程

模拟控制器显示一个列表,该列表显示每个元素的运行时令牌计数。例如,在模拟中,有4个令牌已通过网关元素parallelMerge 。这对于某些统计和分析非常有用。但是,它不显示仿真期间何时遍历了parallelMerge 。为了获得单个令牌的准确跟踪,我们使用属性跟踪实用程序,该实用程序依赖于属性参数。因此,我们创建了一个虚拟参数。

在“配置BPSim”对话框中,展开“业务流程”组。

  • 单击BusinessProcess_Main并在“属性”选项卡上,然后用dummyVariable覆盖 新属性 在“值”字段中,单击Browse.按钮,然后单击“常数”和“数值”,然后在“常数数值”字段中键入“ 0”
  • 点击BusinessProcess_Pool1和执行完全一样的动作为BusinessProcess_Main

任务处理时间

展开“活动”组,然后为此处列出的每个任务元素:选择“时间”选项卡,单击“新参数”下拉箭头并选择“ ProcessingTime”,然后单击“值”列上的Browse.按钮,选择“常数”和“数值”,在“常数数值”字段中输入所指示的值,然后在“ TimeUnit”字段中选择“ seconds”。

  • 任务1(20):20秒
  • 任务2(10):10秒
  • 任务3(20):20秒
  • 任务4(10):10秒
  • 任务5(100):100秒
  • 任务6(10):10秒
  • 任务7(30):30秒
  • 任务8(5):5秒
  • 任务9(10):10秒
  • 任务10(10):10秒
  • 任务11(20):20秒
  • 任务12(100):100秒
  • 任务13(10):10秒

运行模拟

  • 在“配置BPSim”对话框工具栏上,单击“运行”图标以打开“ BPSim Simulation Controller”对话框
  • 单击“运行”图标下拉箭头,然后选择“标准模拟”
  • 模拟后,单击工具栏上的按钮以显示“ BPSim PropertyParameter Values”对话框
  • 单击查询按钮,然后单击“按属性分组”选项卡,然后展开“ dummyVariable”

分析

从模拟的直接结果来看,发生的事情可能并不明显。但是,如果我们为每项任务画出生命线,那就很清楚了。

Timing diagram, BPMN Business Process Simulation in Sparx Systems Enterprise Architect

  • Task1,Task4Task7并行启动
  • 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元素中观察到,方法是:

  1. 双击<< BPSimReport >>元素。
  2. 扩展“时间”组。
  3. 扩展任务元素。
  4. 检查“任务总时间”。
例如,对于元素Task5(100) ,尽管我们将其processingTime设置为100秒,但任务中总时间为20秒,该时间在 20秒时被Receive Signal2中断(边界中断)