# 开始事件

信号开始事件是在接收特定信号后被触发,发起一个流程实例。如果多个流程含有相同信号名称的信号开始事件,那么它们都会被触发。

# XML内容

  <bpmn:process id="Process_signal_start" name="信号开始事件" isExecutable="true">
    <bpmn:startEvent id="StartEvent_1">
      <bpmn:outgoing>Flow_1ncrh9q</bpmn:outgoing>
      <!--包含signalEventDefinition子元素,代表信号开始事件-->
      <bpmn:signalEventDefinition id="SignalEventDefinition_0ku5ibg" signalRef="Signal_3u0nj6v" />
    </bpmn:startEvent>

    <bpmn:sequenceFlow id="Flow_1ncrh9q" sourceRef="StartEvent_1" targetRef="Activity_0myknsu" />
    <bpmn:serviceTask id="Activity_0myknsu" name="测试" activiti:delegateExpression="${test}">
      <bpmn:incoming>Flow_1ncrh9q</bpmn:incoming>
      <bpmn:outgoing>Flow_1t490x6</bpmn:outgoing>
    </bpmn:serviceTask>
    <bpmn:endEvent id="Event_15ztnch">
      <bpmn:incoming>Flow_1t490x6</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="Flow_1t490x6" sourceRef="Activity_0myknsu" targetRef="Event_15ztnch" />
  </bpmn:process>
  <!--定义信号-->
  <bpmn:signal id="Signal_3u0nj6v" name="Signal_3u0nj6v" />

TIP

信号开始事件触发方式有3种:

  1. 由流程中的信号中间抛出事件抛出信号,所有订阅了该信号的信号开始事件所在流程定义都会被启动。
  2. 通过API(runtimeService中以signalEventReceived开头方法)抛出一个信号,所有订阅了该信号的信号开始事件所在的流程定义都会被启动。
  3. 作为普通开始事件,启动流程

# API触发信号开始事件

//通过信号名称发起流程实例
void signalEventReceived(String signalName);
//通过信号名称发起流程实例并设置流程变量
void signalEventReceived(String signalName, Map<String, Object> var2);
//通过信号名称和业务标识发起流程实例
void signalEventReceived(String signalName, String businessKey);
//通过信号名称和业务标识发起流程实例并设置流程变量
void signalEventReceived(String signalName, String businessKey, Map<String, Object> var3);
  • 启动事件是一个特殊的信号事件,用于在流程启动时触发。
  • 当流程启动时,如果存在一个启动事件,并且该事件匹配到了被触发的信号,流程将会被启动。
  • 启动事件可以用于实现流程启动前的条件判断,例如当某个条件满足时,才允许启动流程。