update - 优化流程实例创建逻辑,增加 Context 上下文,作为整条链路的缓存器.
This commit is contained in:
parent
96bd3b89dc
commit
a9abc1add3
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
/**
|
||||
* 用户任务已指派审核人
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user