# 开始事件
开始事件是表示流程开始,定义流程如何启动, 如流程在接收事件启动,在指定时间启动等。开始时间可以有以下5种类型。
- 空开始事件(none start event)
- 定时器开始事件(timer start event)
- 信号开始事件(signal start event)
- 消息开始事件(message start event)
- 错误开始事件(error start event)
# 空开始事件
空开始事件意味着没有指定启动流程实例的触发条件,它是最常用的一种开始事件,一般需要人工启动,或者API触发。
# 图形标记
空开始事件表示为空圆圈,表示未指定触发类型

# 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时启动账单结算处理流程。 当满足设定的时间条件时,定时器开始事件被触发,从而启动流程。
# 图形标记
# 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);
# 信号开始事件
信号开始事件在接收到特定信号被触发,发起一个流程实例,如果多个流程含有相同信号名称的信号开始事件,那么他们都会被触发。
# 图形标记
# 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();
信号开始事件非常适合需要解耦和事件驱动的业务流程场景。
# 消息开始事件
消息开始事件在接收到特定的消息后被触发,发起一个流程实例。
# 图形标记
# 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
);