监听器
有几种方式能处理流程引擎事件,事件是指任务创建、活动完成等。
Spring Events for BPM
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) {
// ...
}
本页是否有帮助?
感谢您的反馈