update - 优化流程实例创建逻辑,增加 Context 上下文,作为整条链路的缓存器.

This commit is contained in:
wangli 2024-04-09 22:15:25 +08:00
parent 96bd3b89dc
commit a9abc1add3
12 changed files with 146 additions and 77 deletions

View File

@ -0,0 +1,52 @@
package cn.axzo.workflow.core.common.context;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessDefinitionVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
import org.flowable.engine.runtime.ProcessInstance;
import java.util.Objects;
import java.util.function.Supplier;
/**
* TODO
*
* @author wangli
* @since 2024/4/9 21:00
*/
public abstract class CommonContext<T> implements OperationContext {
private T context;
private ProcessInstance processInstance;
private BpmnProcessInstanceVO instanceVO;
private BpmnProcessDefinitionVO definitionVO;
public ProcessInstance getProcessInstance(Supplier<ProcessInstance> supplier) {
if (Objects.isNull(processInstance)) {
processInstance = supplier.get();
}
return processInstance;
}
public BpmnProcessInstanceVO getInstanceVO(Supplier<BpmnProcessInstanceVO> supplier) {
if (Objects.isNull(instanceVO)) {
instanceVO = supplier.get();
}
return instanceVO;
}
public BpmnProcessDefinitionVO getDefinitionVO(Supplier<BpmnProcessDefinitionVO> supplier) {
if (Objects.isNull(definitionVO)) {
definitionVO = supplier.get();
}
return definitionVO;
}
@Override
public void setContext(OperationContext context) {
this.context = (T) context;
}
@Override
public T getContext() {
return context;
}
}

View File

@ -0,0 +1,16 @@
package cn.axzo.workflow.core.common.context;
/**
* TODO
*
* @author wangli
* @since 2024/4/9 10:05
*/
public interface OperationContext {
void setContext(OperationContext context);
<T> T getContext();
}

View File

@ -1,44 +0,0 @@
package cn.axzo.workflow.core.common.context;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
/**
* TODO
*
* @author wangli
* @since 2024/4/9 10:05
*/
public class OperationInvokeContext {
private final Map<String, Map<String, Object>> CACHED_MAP = new ConcurrentHashMap<>();
public void init(String traceId) {
Map<String, Object> valueMap = CACHED_MAP.get(traceId);
if (Objects.isNull(valueMap)) {
CACHED_MAP.putIfAbsent(traceId, new ConcurrentHashMap<>());
}
}
public void set(String traceId, String key, Object value) {
Map<String, Object> valueMap = CACHED_MAP.getOrDefault(traceId, new ConcurrentHashMap<>());
valueMap.put(key, value);
CACHED_MAP.putIfAbsent(traceId, valueMap);
}
public Object get(String traceId, String key, Object request, Function function) {
Map<String, Object> value = CACHED_MAP.get(traceId);
if (Objects.isNull(value)) {
Object result = function.apply(request);
set(traceId, key, result);
}
return value.get(key);
}
public void clear(String traceId) {
CACHED_MAP.remove(traceId);
}
}

View File

@ -0,0 +1,37 @@
package cn.axzo.workflow.core.common.context;
import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
/**
* TODO
*
* @author wangli
* @since 2024/4/9 20:59
*/
public class TaskOperationContext extends CommonContext<TaskOperationContext> {
private Map<String, List<ExtAxHiTaskInst>> extTaskMap = new HashMap<>();
private Map<String, List<ExtAxHiTaskInst>> getExtTaskMap() {
return extTaskMap;
}
private void setExtTaskMap(String key, List<ExtAxHiTaskInst> taskInstList) {
extTaskMap.put(key, taskInstList);
}
public List<ExtAxHiTaskInst> getExtTaskInstList(String key, Supplier<List<ExtAxHiTaskInst>> supplier) {
if (getExtTaskMap().containsKey(key)) {
return getExtTaskMap().get(key);
}
setExtTaskMap(key, supplier.get());
return getExtTaskInstList(key, supplier);
}
}

View File

@ -1,6 +1,6 @@
package cn.axzo.workflow.core.engine.listener;
import cn.axzo.workflow.core.common.context.OperationInvokeContext;
import cn.axzo.workflow.core.common.context.TaskOperationContext;
import cn.axzo.workflow.core.listener.BpmnTaskEventListener;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.delegate.TaskListener;
@ -68,10 +68,10 @@ public class EngineTaskEventListener implements TaskListener {
* @return
*/
private List<BpmnTaskEventListener> getOrderedListeners() {
OperationInvokeContext context = new OperationInvokeContext();
TaskOperationContext context = new TaskOperationContext();
List<BpmnTaskEventListener> orderListeners = new ArrayList<>();
taskEventListeners.ifAvailable(orderListeners::addAll);
// orderListeners.forEach();
orderListeners.forEach(i -> i.setContext(context));
return orderListeners;
}

View File

@ -1,8 +1,8 @@
package cn.axzo.workflow.core.listener;
import cn.axzo.workflow.core.common.context.OperationInvokeContext;
import cn.axzo.workflow.core.common.context.OperationContext;
import com.alibaba.fastjson.JSON;
import org.slf4j.MDC;
import org.springframework.util.StringUtils;
import static cn.azxo.framework.common.constatns.Constants.CTX_LOG_ID_MDC;
@ -12,26 +12,25 @@ import static cn.azxo.framework.common.constatns.Constants.CTX_LOG_ID_MDC;
* @author wangli
* @since 2024/4/9 14:21
*/
public abstract class AbstractBpmnEventListener {
public abstract class AbstractBpmnEventListener<T extends OperationContext> implements OperationContext {
private OperationInvokeContext context;
private T context;
public void setContext(OperationInvokeContext context) {
context.init(getTraceId());
this.context = context;
@Override
public void setContext(OperationContext context) {
this.context = (T) context;
}
public OperationInvokeContext getContext() {
@Override
public T getContext() {
return context;
}
public void clear() {
if (StringUtils.hasText(getTraceId())) {
context.clear(getTraceId());
}
}
protected String getTraceId() {
return MDC.get(CTX_LOG_ID_MDC);
}
protected String buildCacheKey(String apiUrl, Object request) {
return apiUrl + JSON.toJSONString(request);
}
}

View File

@ -1,5 +1,6 @@
package cn.axzo.workflow.core.listener;
import cn.axzo.workflow.core.common.context.OperationContext;
import org.flowable.task.service.delegate.DelegateTask;
import org.springframework.core.Ordered;
@ -12,7 +13,7 @@ import org.springframework.core.Ordered;
*
* @author shao_hua
*/
public interface BpmnTaskEventListener extends Ordered {
public interface BpmnTaskEventListener extends OperationContext, Ordered {
/**
* 用户任务已指派审核人

View File

@ -2,6 +2,7 @@ package cn.axzo.workflow.core.listener.impl;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.common.context.TaskOperationContext;
import cn.axzo.workflow.core.engine.event.ExtTaskInstCreateEvent;
import cn.axzo.workflow.core.engine.event.ExtTaskInstUpdateEvent;
import cn.axzo.workflow.core.listener.AbstractBpmnEventListener;
@ -33,7 +34,7 @@ import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCES
@Slf4j
@Component
@AllArgsConstructor
public class InternalExtAxTaskInstEvent_min_Listener extends AbstractBpmnEventListener implements BpmnTaskEventListener {
public class InternalExtAxTaskInstEvent_min_Listener extends AbstractBpmnEventListener<TaskOperationContext> implements BpmnTaskEventListener {
private final RuntimeService runtimeService;
@Override

View File

@ -2,6 +2,7 @@ package cn.axzo.workflow.server.controller.listener.task;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.model.request.bpmn.task.ExtHiTaskSearchDTO;
import cn.axzo.workflow.core.common.context.TaskOperationContext;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import cn.axzo.workflow.core.engine.cmd.CustomApproveTaskCmd;
import cn.axzo.workflow.core.listener.AbstractBpmnEventListener;
@ -61,7 +62,7 @@ import static cn.axzo.workflow.core.common.enums.BpmnProcessTaskResultEnum.REJEC
@Slf4j
@Component
@AllArgsConstructor
public class AutoOperatorEvent_103_Listener extends AbstractBpmnEventListener implements BpmnTaskEventListener, Ordered {
public class AutoOperatorEvent_103_Listener extends AbstractBpmnEventListener<TaskOperationContext> implements BpmnTaskEventListener, Ordered {
@Override
public int getOrder() {
return Integer.MIN_VALUE + 103;
@ -142,9 +143,9 @@ public class AutoOperatorEvent_103_Listener extends AbstractBpmnEventListener im
ExtHiTaskSearchDTO searchDTO = new ExtHiTaskSearchDTO();
searchDTO.setProcessInstanceId(delegateTask.getProcessInstanceId());
searchDTO.setTaskDefinitionKey(i.getActivityId());
getContext().get(getTraceId(), "", searchDTO, a -> extAxHiTaskInstService.queryList(searchDTO));
extAxHiTaskInstService.queryList(searchDTO)
getContext().getExtTaskInstList(buildCacheKey("extAxHiTaskInstService.queryList", searchDTO),
() -> extAxHiTaskInstService.queryList(searchDTO))
// extAxHiTaskInstService.queryList(searchDTO)
.stream().filter(e -> Objects.equals(e.getStatus(), APPROVED.getStatus()))
.map(ExtAxHiTaskInst::getAssignee)
.filter(Objects::nonNull)
@ -265,4 +266,5 @@ public class AutoOperatorEvent_103_Listener extends AbstractBpmnEventListener im
commandExecutor.execute(new CustomApproveTaskCmd(delegateTask.getId(), null, "自动通过",
Collections.emptyList(), assigner, null));
}
}

View File

@ -2,6 +2,7 @@ package cn.axzo.workflow.server.controller.listener.task;
import cn.axzo.workflow.common.model.request.bpmn.BpmnNoticeConf;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.common.context.TaskOperationContext;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import cn.axzo.workflow.core.engine.event.BizSpecifyAssigneeEventImpl;
import cn.axzo.workflow.core.engine.event.MessagePushEventBuilder;
@ -49,7 +50,7 @@ import static cn.axzo.workflow.core.engine.event.BizSpecifyAssigneeEventType.ADD
@Slf4j
@Component
@AllArgsConstructor
public class MessagePushTaskEvent_102_Listener extends AbstractBpmnEventListener implements BpmnTaskEventListener, Ordered {
public class MessagePushTaskEvent_102_Listener extends AbstractBpmnEventListener<TaskOperationContext> implements BpmnTaskEventListener, Ordered {
@Override
public int getOrder() {
return Integer.MIN_VALUE + 102;
@ -75,11 +76,11 @@ public class MessagePushTaskEvent_102_Listener extends AbstractBpmnEventListener
if (Objects.equals(NO_ASSIGNEE, delegateTask.getAssignee())) {
// 业务指定审批人, 不用发待办
// 但需要触发 PROCESS_ACTIVITY_WAIT_ASSIGNEE 事件
ProcessInstance processInstance =
runtimeService.createProcessInstanceQuery().includeProcessVariables().processInstanceId(delegateTask.getProcessInstanceId())
.singleResult();
ProcessEngineConfigurationImpl processEngineConfiguration =
CommandContextUtil.getProcessEngineConfiguration();
ProcessInstance processInstance = getContext().getProcessInstance(() -> runtimeService.createProcessInstanceQuery()
.includeProcessVariables()
.processInstanceId(delegateTask.getProcessInstanceId())
.singleResult());
ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration();
FlowableEventDispatcher eventDispatcher = processEngineConfiguration.getEventDispatcher();
eventDispatcher.dispatchEvent(new BizSpecifyAssigneeEventImpl(ADD_ASSIGNEE, delegateTask,
processInstance.getBusinessKey(), processInstance.getProcessVariables()),
@ -128,8 +129,10 @@ public class MessagePushTaskEvent_102_Listener extends AbstractBpmnEventListener
}
private void pendingPush(DelegateTask delegateTask) {
ProcessInstance processInstance =
runtimeService.createProcessInstanceQuery().processInstanceId(delegateTask.getProcessInstanceId()).includeProcessVariables().singleResult();
ProcessInstance processInstance = getContext().getProcessInstance(() -> runtimeService.createProcessInstanceQuery()
.processInstanceId(delegateTask.getProcessInstanceId())
.includeProcessVariables()
.singleResult());
List<BpmnTaskDelegateAssigner> assigners =
(List<BpmnTaskDelegateAssigner>) processInstance.getProcessVariables()
.getOrDefault(INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + delegateTask.getTaskDefinitionKey(), Collections.emptyList());

View File

@ -5,6 +5,7 @@ import cn.axzo.framework.rocketmq.EventProducer;
import cn.axzo.workflow.common.enums.ProcessTaskEventEnum;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.common.model.response.mq.ProcessTaskDTO;
import cn.axzo.workflow.core.common.context.TaskOperationContext;
import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper;
import cn.axzo.workflow.core.listener.AbstractBpmnEventListener;
import cn.axzo.workflow.core.listener.BpmnTaskEventListener;
@ -42,7 +43,7 @@ import static cn.axzo.workflow.common.enums.ProcessTaskEventEnum.PROCESS_TASK_DE
*/
@Slf4j
@Component
public class RocketMqBpmnTaskEvent_101_Listener extends AbstractBpmnEventListener implements BpmnTaskEventListener, Ordered {
public class RocketMqBpmnTaskEvent_101_Listener extends AbstractBpmnEventListener<TaskOperationContext> implements BpmnTaskEventListener, Ordered {
@Override
public int getOrder() {
return Integer.MIN_VALUE + 101;

View File

@ -1,6 +1,7 @@
package cn.axzo.workflow.server.controller.listener.task;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner;
import cn.axzo.workflow.core.common.context.TaskOperationContext;
import cn.axzo.workflow.core.listener.AbstractBpmnEventListener;
import cn.axzo.workflow.core.listener.BpmnTaskEventListener;
import lombok.AllArgsConstructor;
@ -31,7 +32,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELAT
@Slf4j
@Component
@AllArgsConstructor
public class SnapshotBpmnTaskTaskEvent_100_Listener extends AbstractBpmnEventListener implements BpmnTaskEventListener, Ordered {
public class SnapshotBpmnTaskTaskEvent_100_Listener extends AbstractBpmnEventListener<TaskOperationContext> implements BpmnTaskEventListener, Ordered {
@Override
public int getOrder() {
return Integer.MIN_VALUE + 100;