# 开始事件

开始事件是表示流程开始,定义流程如何启动, 如流程在接收事件启动,在指定时间启动等。开始时间可以有以下5种类型。

  • 空开始事件(none start event)
  • 定时器开始事件(timer start event)
  • 信号开始事件(signal start event)
  • 消息开始事件(message start event)
  • 错误开始事件(error start event)

# 空开始事件

空开始事件意味着没有指定启动流程实例的触发条件,它是最常用的一种开始事件,一般需要人工启动,或者API触发。

# 图形标记

空开始事件表示为空圆圈,表示未指定触发类型
foo

# XML内容

<startEvent id="noneStartEvent" name="流程开始" />
<!-- 在子流程中必须有有空开始事件,因为子流程需要父流程调用发起 -->

# 核心API

// 获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();

// 方法1:最基本的启动方式
ProcessInstance startProcessInstanceByKey(String processDefinitionKey)

// 方法2:带业务主键启动
ProcessInstance startProcessInstanceByKey(String processDefinitionKey, 
                                         String businessKey)

// 方法3:带流程变量启动
ProcessInstance startProcessInstanceByKey(String processDefinitionKey, 
                                         Map<String, Object> variables)

// 方法4:完整参数启动
ProcessInstance startProcessInstanceByKey(String processDefinitionKey, 
                                         String businessKey,
                                         Map<String, Object> variables)

# 定时器开始事件

定时器开始事件用于在指定的时间启动一个流程,或者在指定周期内循环启动多次流程。如在2025年1月1号发起年度目标审核流程,或者每月1日0时启动账单结算处理流程。 当满足设定的时间条件时,定时器开始事件被触发,从而启动流程。

# 图形标记

foo

# XML内容

<!--固定时间-->
<startEvent id="timerStartEvent" name="定时启动">
    <timerEventDefinition>
        <timeDate>2024-12-01T09:00:00</timeDate>
    </timerEventDefinition>
</startEvent>

<!--持续时间,从当前时间开始计算的时间段-->
<timerEventDefinition>
    <timeDuration>PT5M</timeDuration> <!-- 5分钟后 -->
</timerEventDefinition>

<!--循环定时器-->
<timerEventDefinition>
    <timeCycle>R3/PT1H</timeCycle> <!-- 每小时执行一次,共3次 -->
</timerEventDefinition>

# 核心API

// 获取ManagementService(用于管理作业)
ManagementService managementService = processEngine.getManagementService();

// 查询定时器作业
List<Job> jobs = managementService.createJobQuery()
    .timers()
    .list();

// 手动执行作业(开发调试用)
managementService.executeJob(String jobId);

// 暂停/激活作业
managementService.suspendJobById(String jobId);
managementService.activateJobById(String jobId);

# 信号开始事件

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

# 图形标记

foo

# XML内容

<startEvent id="signalStartEvent" name="信号触发">
    <signalEventDefinition signalRef="alertSignal" />
</startEvent>

# API接口

// 通过RuntimeService发送信号
runtimeService.createSignalEvent("orderReceivedSignal")
    .send();

// 带变量的信号
Map<String, Object> variables = new HashMap<>();
variables.put("orderId", "12345");
variables.put("customerName", "张三");

runtimeService.createSignalEvent("orderReceivedSignal")
    .setVariables(variables)
    .send();

// 指定租户的信号
runtimeService.createSignalEvent("orderReceivedSignal")
    .tenantId("tenant1")
    .send();

信号开始事件非常适合需要解耦和事件驱动的业务流程场景。

# 消息开始事件

消息开始事件在接收到特定的消息后被触发,发起一个流程实例。

# 图形标记

foo

# XML内容

<startEvent id="messageStartEvent" name="消息接收">
    <messageEventDefinition messageRef="orderMessage" />
</startEvent>

# API接口

/**
 * 通过消息名称启动流程实例(最新版本)
 * @param messageName 消息名称
 * @return 启动的流程实例
 */
ProcessInstance startProcessInstanceByMessage(String messageName);

// 使用示例
ProcessInstance instance = runtimeService.startProcessInstanceByMessage("orderReceivedMessage");

/**
 * 带变量启动流程实例
 * @param messageName 消息名称
 * @param variables 流程变量
 * @return 启动的流程实例
 */
ProcessInstance startProcessInstanceByMessage(String messageName, 
                                             Map<String, Object> variables);

// 使用示例
Map<String, Object> variables = new HashMap<>();
variables.put("orderId", "12345");
variables.put("customerName", "张三");
variables.put("amount", 1000.00);

ProcessInstance instance = runtimeService.startProcessInstanceByMessage(
    "orderReceivedMessage", 
    variables
);


/**
 * 指定业务键启动流程实例
 * @param messageName 消息名称
 * @param businessKey 业务键
 * @return 启动的流程实例
 */
ProcessInstance startProcessInstanceByMessage(String messageName, 
                                             String businessKey);

// 使用示例
ProcessInstance instance = runtimeService.startProcessInstanceByMessage(
    "orderReceivedMessage", 
    "ORDER-2023-001"
);


/**
 * 指定业务键和变量启动流程实例
 * @param messageName 消息名称
 * @param businessKey 业务键
 * @param variables 流程变量
 * @return 启动的流程实例
 */
ProcessInstance startProcessInstanceByMessage(String messageName,
                                             String businessKey,
                                             Map<String, Object> variables);

// 使用示例
Map<String, Object> variables = new HashMap<>();
variables.put("orderId", "12345");
variables.put("amount", 1000.00);

ProcessInstance instance = runtimeService.startProcessInstanceByMessage(
    "orderReceivedMessage",
    "ORDER-2023-001",
    variables
);