项目需要在每个待办Task到达时,发送一个消息提醒用户过来处理。不想在每个工作流单独加监听器,这时候可以使用Flowable的全局监听器。
定义一个监听器
package com.azhuzhu.flowable.listener;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.TaskService;
import org.flowable.engine.common.api.delegate.event.FlowableEvent;
import org.flowable.engine.common.api.delegate.event.FlowableEventListener;
import org.flowable.engine.common.impl.event.FlowableEntityEventImpl;
import org.flowable.identitylink.api.IdentityLink;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 全局监听-工作流待办消息提醒
*
* @author azhuzhu
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class TaskCreateListener implements FlowableEventListener {
private final TaskService taskService;
@Override
public void onEvent(FlowableEvent flowableEvent) {
TaskEntity taskEntity = (TaskEntity) ((FlowableEntityEventImpl) flowableEvent).getEntity();
String taskId = taskEntity.getId();
List<IdentityLink> idList = taskService.getIdentityLinksForTask(taskId);
if (CollectionUtils.isEmpty(idList)) {
return;
}
List<String> userNameList = new ArrayList<>();
// 获取接收人,此处从Identity获取,实际情况会更复杂
idList.forEach(identityLink -> {
if (StringUtils.isNotBlank(identityLink.getUserId())) {
userNameList.add(identityLink.getUserId());
}
});
if (CollectionUtils.isNotEmpty(userNameList)) {
// TODO: @author azhuzhu 发送提醒消息
}
}
@Override
public boolean isFailOnException() {
return false;
}
@Override
public boolean isFireOnTransactionLifecycleEvent() {
return false;
}
@Override
public String getOnTransaction() {
return null;
}
}
注册全局监听器
package com.azhuzhu.flowable.config;
import com.azhuzhu.flowable.listener.TaskCreateListener;
import lombok.RequiredArgsConstructor;
import org.flowable.engine.common.api.delegate.event.FlowableEngineEventType;
import org.flowable.engine.common.api.delegate.event.FlowableEventDispatcher;
import org.flowable.spring.SpringProcessEngineConfiguration;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
/**
* Flowable添加全局监听器
*
* @author azhuzhu
*/
@Configuration
@RequiredArgsConstructor
public class FlowableGlobalListenerConfig implements ApplicationListener<ContextRefreshedEvent> {
private final SpringProcessEngineConfiguration configuration;
private final TaskCreateListener taskCreateListener;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
FlowableEventDispatcher dispatcher = configuration.getEventDispatcher();
// 任务创建全局监听-待办消息发送
dispatcher.addEventListener(taskCreateListener, FlowableEngineEventType.TASK_CREATED);
}
}