• activiti-api-impl


    Survive by day and develop by night.
    talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
    happy for hardess to solve denpendies.

    目录

    在这里插入图片描述

    概述

    activiti-api-impl的是一个非常常见的需求。

    需求:

    设计思路

    在这里插入图片描述

    实现思路分析

    1.CommonModelAutoConfiguration

    @Configuration
    @PropertySource("classpath:conf/rest-jackson-configuration.properties") //load default jackson configuration
    public class CommonModelAutoConfiguration {
    
        //this bean will be automatically injected inside boot's ObjectMapper
        @Bean
        public Module customizeCommonModelObjectMapper() {
            SimpleModule module = new SimpleModule("mapCommonModelInterfaces",
                                                   Version.unknownVersion());
            SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver() {
                //this is a workaround for https://github.com/FasterXML/jackson-databind/issues/2019
                //once version 2.9.6 is related we can remove this @override method
                @Override
                public JavaType resolveAbstractType(DeserializationConfig config,
                                                    BeanDescription typeDesc) {
                    return findTypeMapping(config,
                                           typeDesc.getType());
                }
            };
    
            resolver.addMapping(VariableInstance.class,
                                VariableInstanceImpl.class);
    
            module.setAbstractTypes(resolver);
    
            module.setMixInAnnotation(Payload.class,
                                      PayloadMixIn.class);
            module.setMixInAnnotation(Result.class,
                                      ResultMixIn.class);
    
            module.registerSubtypes(new NamedType(EmptyResult.class,
                                                  EmptyResult.class.getSimpleName()));
    
            return module;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    2.RuntimeEventImpl

    public abstract class RuntimeEventImpl<ENTITY_TYPE, EVENT_TYPE extends Enum<?>> implements RuntimeEvent<ENTITY_TYPE, EVENT_TYPE> {
    
        private String id;
        private Long timestamp;
        private String processInstanceId;
        private String processDefinitionId;
        private String processDefinitionKey;
        private Integer processDefinitionVersion;
        private String businessKey;
        private String parentProcessInstanceId;
    
        private ENTITY_TYPE entity;
    
        public RuntimeEventImpl() {
            id = UUID.randomUUID().toString();
            timestamp = System.currentTimeMillis();
        }
    
        public RuntimeEventImpl(ENTITY_TYPE entity) {
            this();
            this.entity = entity;
        }
    
        public RuntimeEventImpl(String id,
                                Long timestamp,
                                ENTITY_TYPE entity) {
            this.id = id;
            this.timestamp = timestamp;
            this.entity = entity;
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    3.ProcessModelAutoConfiguration

    public class ProcessModelAutoConfiguration {
    
        @Autowired(required = false)
        @ProcessVariableTypeConverter
        @Lazy
        private Set<Converter<?, ?>> converters = Collections.emptySet();
    
    
        //this bean will be automatically injected inside boot's ObjectMapper
        @Bean
        @Order(Ordered.HIGHEST_PRECEDENCE)
        public Module customizeProcessModelObjectMapper(ObjectProvider<ConversionService> conversionServiceProvider) {
            SimpleModule module = new SimpleModule("mapProcessModelInterfaces",
                                                   Version.unknownVersion());
            SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver() {
                //this is a workaround for https://github.com/FasterXML/jackson-databind/issues/2019
                //once version 2.9.6 is related we can remove this @override method
                @Override
                public JavaType resolveAbstractType(DeserializationConfig config,
                                                    BeanDescription typeDesc) {
                    return findTypeMapping(config,
                                           typeDesc.getType());
                }
            };
    
            resolver.addMapping(BPMNActivity.class,
                                BPMNActivityImpl.class);
            resolver.addMapping(ProcessInstance.class,
                                ProcessInstanceImpl.class);
            resolver.addMapping(ProcessDefinition.class,
                                ProcessDefinitionImpl.class);
            resolver.addMapping(BPMNSequenceFlow.class,
                                BPMNSequenceFlowImpl.class);
            resolver.addMapping(IntegrationContext.class,
                                IntegrationContextImpl.class);
            resolver.addMapping(BPMNSignal.class,
            					BPMNSignalImpl.class);
            resolver.addMapping(BPMNTimer.class,
                                BPMNTimerImpl.class);
            resolver.addMapping(BPMNMessage.class,
                                BPMNMessageImpl.class);
            resolver.addMapping(BPMNError.class,
                                BPMNErrorImpl.class);
            resolver.addMapping(MessageSubscription.class,
                                MessageSubscriptionImpl.class);
            resolver.addMapping(StartMessageSubscription.class,
                                StartMessageSubscriptionImpl.class);
            resolver.addMapping(StartMessageDeployedEvent.class,
                                StartMessageDeployedEventImpl.class);
            resolver.addMapping(StartMessageDeploymentDefinition.class,
                                StartMessageDeploymentDefinitionImpl.class);
            resolver.addMapping(ProcessCandidateStarterUser.class,
                                ProcessCandidateStarterUserImpl.class);
            resolver.addMapping(ProcessCandidateStarterGroup.class,
                                ProcessCandidateStarterGroupImpl.class);
    
            module.registerSubtypes(new NamedType(ProcessInstanceResult.class,
                                                  ProcessInstanceResult.class.getSimpleName()));
    
            module.registerSubtypes(new NamedType(DeleteProcessPayload.class,
                                                  DeleteProcessPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(GetProcessDefinitionsPayload.class,
                                                  GetProcessDefinitionsPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(GetProcessInstancesPayload.class,
                                                  GetProcessInstancesPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(GetVariablesPayload.class,
                                                  GetVariablesPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(RemoveProcessVariablesPayload.class,
                                                  RemoveProcessVariablesPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(SetProcessVariablesPayload.class,
                                                  SetProcessVariablesPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(SignalPayload.class,
                                                  SignalPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(TimerPayload.class,
                                                  TimerPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(StartProcessPayload.class,
                                                  StartProcessPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(CreateProcessInstancePayload.class,
                                                  CreateProcessInstancePayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(SuspendProcessPayload.class,
                                                  SuspendProcessPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(ResumeProcessPayload.class,
                                                  ResumeProcessPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(UpdateProcessPayload.class,
                                                  UpdateProcessPayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(StartMessagePayload.class,
                                                  StartMessagePayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(ReceiveMessagePayload.class,
                                                  ReceiveMessagePayload.class.getSimpleName()));
            module.registerSubtypes(new NamedType(MessageEventPayload.class,
                                                  MessageEventPayload.class.getSimpleName()));
            module.setAbstractTypes(resolver);
    
            ConversionService conversionService = conversionServiceProvider.getIfUnique(this::conversionService);
    
            module.addSerializer(new ProcessVariablesMapSerializer(conversionService));
    
            module.addDeserializer(ProcessVariablesMap.class,
                                   new ProcessVariablesMapDeserializer(conversionService));
    
            return module;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102

    4.DefaultServiceTaskBehavior

    在这里插入图片描述
    在这里插入图片描述

    public class DefaultServiceTaskBehavior extends AbstractBpmnActivityBehavior {
    
        private final ApplicationContext applicationContext;
        private final IntegrationContextBuilder integrationContextBuilder;
        private final VariablesPropagator variablesPropagator;
    
        public DefaultServiceTaskBehavior(ApplicationContext applicationContext,
            IntegrationContextBuilder integrationContextBuilder, VariablesPropagator variablesPropagator) {
            this.applicationContext = applicationContext;
            this.integrationContextBuilder = integrationContextBuilder;
            this.variablesPropagator = variablesPropagator;
        }
    
        /**
         * We have two different implementation strategy that can be executed
         * in according if we have a connector action definition match or not.
         **/
        @Override
        public void execute(DelegateExecution execution) {
            Connector connector = getConnector(getImplementation(execution));
            IntegrationContext integrationContext = connector.apply(integrationContextBuilder.from(execution));
    
            variablesPropagator.propagate(execution, integrationContext.getOutBoundVariables());
            leave(execution);
        }
    
        private String getImplementation(DelegateExecution execution) {
            return ((ServiceTask) execution.getCurrentFlowElement()).getImplementation();
        }
    
        private Connector getConnector(String implementation) {
            return applicationContext.getBean(implementation,
                                              Connector.class);
        }
    
        private String getServiceTaskImplementation(DelegateExecution execution) {
            return ((ServiceTask) execution.getCurrentFlowElement()).getImplementation();
        }
    
        public boolean hasConnectorBean(DelegateExecution execution) {
            String implementation = getServiceTaskImplementation(execution);
            return applicationContext.containsBean(implementation) && applicationContext.getBean(implementation) instanceof Connector;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    5.APIVariableInstanceConverter

    在这里插入图片描述

    
    public class APIVariableInstanceConverter
            extends ListConverter<org.activiti.engine.impl.persistence.entity.VariableInstance, VariableInstance>
            implements ModelConverter<org.activiti.engine.impl.persistence.entity.VariableInstance, VariableInstance> {
    
        @Override
        public VariableInstance from(org.activiti.engine.impl.persistence.entity.VariableInstance internalVariableInstance) {
            return new VariableInstanceImpl<>(internalVariableInstance.getName(),
                    internalVariableInstance.getTypeName(),
                    internalVariableInstance.getValue(),
                    internalVariableInstance.getProcessInstanceId(),
                    internalVariableInstance.getTaskId());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    TaskModelAutoConfiguration

    public class TaskModelAutoConfiguration {
    
        //this bean will be automatically injected inside boot's ObjectMapper
        @Bean
        public Module customizeTaskModelObjectMapper() {
            SimpleModule module = new SimpleModule("mapTaskRuntimeInterfaces",
                                                   Version.unknownVersion());
            SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver() {
                //this is a workaround for https://github.com/FasterXML/jackson-databind/issues/2019
                //once version 2.9.6 is related we can remove this @override method
                @Override
                public JavaType resolveAbstractType(DeserializationConfig config,
                                                    BeanDescription typeDesc) {
                    return findTypeMapping(config,
                                           typeDesc.getType());
                }
            };
            resolver.addMapping(Task.class,
                                TaskImpl.class);
            resolver.addMapping(TaskCandidateUser.class,
                                TaskCandidateUserImpl.class);
            resolver.addMapping(TaskCandidateGroup.class,
                                TaskCandidateGroupImpl.class);
    
            module.registerSubtypes(new NamedType(TaskResult.class,
                                                  TaskResult.class.getSimpleName()));
    
            module.registerSubtypes(new NamedType(ClaimTaskPayload.class,
                                                  ClaimTaskPayload.class.getSimpleName()));
    
            module.registerSubtypes(new NamedType(CompleteTaskPayload.class,
                                                  CompleteTaskPayload.class.getSimpleName()));
    
            module.registerSubtypes(new NamedType(SaveTaskPayload.class,
                                                  SaveTaskPayload.class.getSimpleName()));
    
            module.registerSubtypes(new NamedType(CreateTaskPayload.class,
                                                  CreateTaskPayload.class.getSimpleName()));
    
            module.registerSubtypes(new NamedType(DeleteTaskPayload.class,
                                                  DeleteTaskPayload.class.getSimpleName()));
    
            module.registerSubtypes(new NamedType(GetTasksPayload.class,
                                                  GetTasksPayload.class.getSimpleName()));
    
            module.registerSubtypes(new NamedType(GetTaskVariablesPayload.class,
                                                  GetTaskVariablesPayload.class.getSimpleName()));
    
            module.registerSubtypes(new NamedType(ReleaseTaskPayload.class,
                                                  ReleaseTaskPayload.class.getSimpleName()));
    
            module.registerSubtypes(new NamedType(UpdateTaskPayload.class,
                                                  UpdateTaskPayload.class.getSimpleName()));
    
            module.setAbstractTypes(resolver);
    
            return module;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    至此core 包分析完毕。

    参考资料和推荐阅读

    [1]. https://www.activiti.org/

    欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~

  • 相关阅读:
    总被误解的“零信任”,有哪些关键技术?
    小提琴图的绘制方法:Python matplotlib实现
    dnan的好处2
    Painless脚本在Elasticsearch的高级应用
    力扣(141.21)补9.1
    SDL2 播放音频(MP4)
    CSS 动画一站式指南
    Git的标签管理
    Jmeter 自动化性能测试常见问题汇总
    如何将动态页面静态化——模板文件(输出到一个文件里面)
  • 原文地址:https://blog.csdn.net/xiamaocheng/article/details/128057574