事件监听器
有几种方式能处理流程引擎事件,事件是指任务创建、活动完成等。
第一种方式,可以为特定的流程节点定义一个执行监听器或者任务监听器。参阅 Flowable 文档 了解详情。
流程家默契提供配置监听器的 UI。
-
在执行监听编辑器中,下拉列表包含实现了
org.flowable.engine.delegate.ExecutionListener
接口的类。 -
在任务监听编辑器中,下拉列表包含实现了
org.flowable.engine.delegate.TaskListener
接口的类。如果类包含 注入字段,则这些字段会自动添加到监听编辑器的 Fields(字段) 区域。
第二种方式,可以声明由 Flowable 框架提供的全局事件监听器,参阅 事件处理器 章节。在项目属性面板中,可以在 Event listeners(事件监听器) 区域定义。
BPM 扩展组件还引入了一组 Spring 应用事件,会发布下列事件:
-
UserTaskAssignedEvent
-
UserTaskCreatedEvent
-
UserTaskCompletedEvent
-
ActivityStartedEvent
-
ActivityCompletedEvent
-
ProcessStartedEvent
-
ProcessCompletedEvent
下面示例中,每次分配用户任务时,都会发送一个 email 通知:
@Component("smpl_TaskAssignedNotificationSender")
public class TaskAssignedNotificationSender {
@Autowired
private Emailer emailer;
@Autowired
private DataManager dataManager;
@EventListener (1)
public void onTaskAssigned(UserTaskAssignedEvent event) { (2)
User user = dataManager.load(User.class) (3)
.query("select u from smpl_User u where u.username = :username")
.parameter("username", event.getUsername())
.one();
Task task = event.getTask(); (4)
String emailTitle = "New process task " + task.getName();
String emailBody = "Hi " + user.getFirstName() + "\n" +
"The task " + task.getName() + " has been assigned.";
EmailInfo emailInfo = EmailInfoBuilder.create()
.setAddresses(user.getEmail())
.setSubject(emailTitle)
.setFrom(null)
.setBody(emailBody)
.build();
emailer.sendEmailAsync(emailInfo); (5)
}
}
1 | 声明方法为事件监听器。 |
2 | 每次 UserTaskAssignedEvent 事件发布时,都会触发监听器。 |
3 | 加载 User 实体,以便获取用户姓名和 email 地址。UserTaskAssignedEvent 事件包含任务执行人的 username 。 |
4 | UserTaskAssignedEvent 事件包含一个 Task 对象,里面有关于用户任务的信息。 |
5 | 创建并发送 email。参阅 Email 发送 了解详情。 |
如需在监听器中获取流程变量的值,可以这么做:
@Autowired
private RuntimeService runtimeService;
@EventListener
public void onOtherProcessTaskAssigned(UserTaskAssignedEvent event) {
Order order = (Order) runtimeService.getVariable(event.getTask().getExecutionId(), "order");
// ...
}
默认情况下,在任何流程中分配用户任务都会触发监听器。如果只想在特定的流程定义中发送通知,可以在监听器的方法体中检查流程定义:
@EventListener
protected void onOtherProcessTaskAssigned(UserTaskAssignedEvent event) {
if ("order-approval".equals(event.getProcessDefinition().getKey())) {
// ...
}
}
或者可以定义一个 SpEL(Spring 表达式语言)表达式,用来匹配处理的事件:
@EventListener(condition = "#event.processDefinitionData.key == 'order-approval'")
protected void onOtherProcessTaskAssigned(UserTaskAssignedEvent event) {
// ...
}
本页是否有帮助?
感谢您的反馈