1. 前言
上一篇博客【SpringBoot整合Flowable工作流-2(代码整合) 】介绍代码整合部分。
这篇博客主要介绍 Flowable 的全局事件监听器,并且基于事件监听器实现业务的通知等业务。
2. 代码实现
2.1 实现 FlowableEventListener 接口
@Component
@Slf4j
public class FlowableBaseEventListenerImpl implements FlowableEventListener {
@Autowired
private FlowableTaskCreatedCallback flowableTaskCreatedCallback;
@Autowired
private FlowableTaskCompletedCallback flowableTaskCompletedCallback;
@Autowired
private FlowableInstanceFinishedCallback flowableInstanceFinishedCallback;
@Autowired
private FlowableInstanceDeletedCallback flowableInstanceDeletedCallback;
//
@Autowired
private RuntimeService runtimeService;
@Autowired
private RepositoryService repositoryService;
@Qualifier("processEngine")
@Autowired
private ProcessEngine processEngine;
@Autowired
private TaskService taskService;
@Autowired
protected ManagementService managementService;
@Autowired
protected HistoryService historyService;
@Autowired
private AuthHelper authHelper;
@Override
public void onEvent(FlowableEvent event) {
FlowableEventType type = event.getType();
ProcessInstanceNotifyRequestDTO requestDTO = null;
if (type == FlowableEngineEventType.TASK_CREATED) {
// 用户任务创建完成
if (event instanceof org.flowable.common.engine.impl.event.FlowableEntityEventImpl) {
org.flowable.common.engine.impl.event.FlowableEntityEventImpl eventImpl = (org.flowable.common.engine.impl.event.FlowableEntityEventImpl) event;
TaskEntityImpl taskEntity = (TaskEntityImpl) eventImpl.getEntity();
requestDTO = flowableTaskCreatedCallback.call(eventImpl, taskEntity);
}
} else if (type == FlowableEngineEventType.TASK_COMPLETED) {
// 用户审批任务
if (event instanceof org.flowable.engine.delegate.event.impl.FlowableEntityWithVariablesEventImpl) {
org.flowable.engine.delegate.event.impl.FlowableEntityWithVariablesEventImpl eventImpl = (org.flowable.engine.delegate.event.impl.FlowableEntityWithVariablesEventImpl) event;
TaskEntityImpl taskEntity = (TaskEntityImpl) eventImpl.getEntity();
requestDTO = flowableTaskCompletedCallback.call(eventImpl, taskEntity);
}
} else if (type == FlowableEngineEventType.PROCESS_COMPLETED) {
// 流程完成
if (event instanceof org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl) {
org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl eventImpl = (org.flowable.engine.delegate.event.impl.FlowableEntityEventImpl) event;
ExecutionEntityImpl taskEntity = (ExecutionEntityImpl) eventImpl.getEntity();
requestDTO = flowableInstanceFinishedCallback.call(eventImpl, taskEntity);
}
} else if (type == FlowableEngineEventType.PROCESS_CANCELLED) {
// 流程删除
if (event instanceof org.flowable.engine.delegate.event.impl.FlowableProcessCancelledEventImpl) {
org.flowable.engine.delegate.event.impl.FlowableProcessCancelledEventImpl eventImpl = (org.flowable.engine.delegate.event.impl.FlowableProcessCancelledEventImpl) event;
requestDTO = flowableInstanceDeletedCallback.call(eventImpl, null);
}
}
if (requestDTO != null) {
BpmnModel bpmnModel = repositoryService.getBpmnModel(requestDTO.getProcessDefinitionId());
Map<String, String> dataObjectMap = bpmnModel.getMainProcess().getDataObjects().stream()
.collect(Collectors.toMap(v -> v.getId(), v -> v.getValue() == null ? "" : v.getValue().toString()));
String businessNotifyUri = dataObjectMap.get(WorkflowConstants.BUSINESS_NOTIFY_URI);
//
log.info("processInstanceId:[{}] businessNotifyUri: [{}], requestDTO: {}",
requestDTO.getProcessInstanceId(),
businessNotifyUri,
JSON.toJSONString(requestDTO));
//
if (StringUtils.isNotEmpty(businessNotifyUri)) {
if (businessNotifyUri.startsWith("/")) {
HttpServletRequest request = SpringContextUtil.getHttpServletRequest();
String origin = request.getHeader("gateway-forwarded-origin");
//
businessNotifyUri = origin + businessNotifyUri;
}
//
ProcessInstanceNotifyRequestDTO finalRequestDTO = requestDTO;
String finalBusinessNotifyUri = businessNotifyUri;
String token = authHelper.getToken();
//noinspection AlibabaAvoidManuallyCreateThread
new Thread(() -> {
// TODO 以后完善为线程池异步
try {
Thread.sleep(2000);
// 延迟2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
String data = "";
try (FastHttpClient httpClient = FastHttpClient.builder().build()) {
//
Map<String, String> queryMap = finalRequestDTO.toMap();
queryMap.put("sign", WorkflowSignerUtil.sign(WorkflowSignerUtil.mapToSignText(queryMap), finalRequestDTO.getProcessInstanceId()));
//
StringJoiner joiner = new StringJoiner("&");
queryMap.forEach((key, val) -> joiner.add(key + "=" + URLEncoder.ALL.encode(val == null ? "" : val, StandardCharsets.UTF_8)));
HttpGet httpGet = httpClient.buildGet(finalBusinessNotifyUri + "?" + joiner.toString());
httpGet.setHeader(Constant.TOKEN_NAME, token);
Response<String> response = httpClient.execute(httpGet, ResponseHandler.ofString(StandardCharsets.UTF_8));
data = response.getData();
} catch (Exception e) {
log.warn("", e);
data = e.getMessage();
}
data = StringUtils.abbreviate(data, 1000);
log.info("processInstanceId:[{}] notify response: {}", finalRequestDTO.getProcessInstanceId(), data);
}).start();
}
}
}
@Override
public boolean isFailOnException() {
return false;
}
@Override
public boolean isFireOnTransactionLifecycleEvent() {
return false;
}
@Override
public String getOnTransaction() {
return null;
}
}
2.2 添加全局事件监听器
@Slf4j
@Component
@Configuration
public class InitConfig implements CommandLineRunner {
@Autowired
private RuntimeService runtimeService;
@Autowired
private FlowableBaseEventListenerImpl flowableBaseEventListener;
@Override
public void run(String... args) {
runtimeService.addEventListener(flowableBaseEventListener);
}
}
3. SpringBoot整合Flowable工作流相关文章
- 博客:https://ihouyu.cn/
- 邮箱:for.houyu@qq.com
- 公众号:IT加载中(it_loading)