activiti-api-impl

  • 目录
    • 概述
      • 需求:
    • 设计思路
    • 实现思路分析
      • 1.CommonModelAutoConfiguration
      • 2.RuntimeEventImpl
      • 3.ProcessModelAutoConfiguration
      • 4.DefaultServiceTaskBehavior
      • 5.APIVariableInstanceConverter
    • TaskModelAutoConfiguration
  • 参考资料和推荐阅读

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@Beanpublic 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@Overridepublic 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;}
}

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;}

3.ProcessModelAutoConfiguration

public class ProcessModelAutoConfiguration {@Autowired(required = false)@ProcessVariableTypeConverter@Lazyprivate 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@Overridepublic 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;}

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.**/@Overridepublic 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;}
}

5.APIVariableInstanceConverter


public class APIVariableInstanceConverterextends ListConverter<org.activiti.engine.impl.persistence.entity.VariableInstance, VariableInstance>implements ModelConverter<org.activiti.engine.impl.persistence.entity.VariableInstance, VariableInstance> {@Overridepublic VariableInstance from(org.activiti.engine.impl.persistence.entity.VariableInstance internalVariableInstance) {return new VariableInstanceImpl<>(internalVariableInstance.getName(),internalVariableInstance.getTypeName(),internalVariableInstance.getValue(),internalVariableInstance.getProcessInstanceId(),internalVariableInstance.getTaskId());}
}

TaskModelAutoConfiguration

public class TaskModelAutoConfiguration {//this bean will be automatically injected inside boot's ObjectMapper@Beanpublic 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@Overridepublic 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;}
}

至此core 包分析完毕。

参考资料和推荐阅读

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

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

activiti-api-impl相关推荐

  1. activiti 入门——activiti API (二)

    上一篇介绍了activiti,以及一个简单的demo.估计很多刚接触activiti的小伙伴还是迷迷糊糊的,这篇会详细介绍activiti API相信看完之后会为你解决之前的困惑. activiti ...

  2. activiti api文档_【白银人机】Activiti 工作流从入门到入土:完整 hello world 大比拼(API 结合实例讲解)...

    点击上方"好好学java",选择"置顶"公众号 重磅资源.干货,第一时间送达 重磅推荐  ① 纯福利 | 公众号资源大汇总,一年才一次! ② 重磅!!2018年 ...

  3. 解决工作流:org.activiti.engine.ActivitiException: Unknown property used in expression: ${AAAAA}报错

    工作流流向有一个以上的流的方向的时候,必须指定流向,默认时用EL表达式表示,比如一个节点既可以流到A5也可以流到A6,当业务需要流向A5 的时候须指定流转条件${A5} 一条流程有多个流转条件的时候, ...

  4. [Validation set: 'activiti-executable-process' | Problem: 'activiti-exclusive-gateway-condition-not-

    Spring boot集成activity报错信息: [DUBBO] Decode decodeable message com.alibaba.dubbo.rpc.protocol.dubbo.De ...

  5. JAVAWEB开发之工作流详解(一)——Activiti的环境搭建、插件安装、核心API

    工作流的概念 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任 ...

  6. JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成

    管理流程定义 设计流程定义文档 bpmn文件 设置方式可以直接使用插件图形化界面进行设置 为某任务节点指定任务执行者 保存后的BPMN文件可以使用XML编辑器打开 BPMN 2.0根节点是defini ...

  7. Liferay7 BPM门户开发之11: Activiti工作流程开发的一些统一规则和实现原理(完整版)...

    注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,"启动者变量"名统一设置为initUserId 启动时 ...

  8. 工作流引擎 Activiti 实战系列

    Activiti整合Spring 一.Activiti与Spring整合开发 1.1 Activiti与Spring整合的配置 1).在pom.xml文件引入坐标 如下 <properties& ...

  9. 工作流引擎 Activiti 万字详细进阶

    Activiti进阶 一.流程实例 什么是流程实例 流程实例(ProcessInstance)代表流程定义的执行实例. 一个流程实例包括了所有的运行节点.我们可以利用这个对象来了解当前流程实例的进度等 ...

  10. Activiti 5.1.4最佳实践

    1.简单介绍 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度. Activiti 作为一个遵从 Apache 许可的工作流和业 ...

最新文章

  1. iOS调用系统相机文字改为中文
  2. D~信息学/计算机专业操作
  3. Chrome插件-新浪微博阅读器
  4. python matplotlib.pyplot() plt() 如何限制坐标的上下限?plt.xlim() plt.ylim()
  5. Xcode更改ios app图标
  6. scrapy从入门到放弃 学习项目2
  7. kotlin中学习笔记——null
  8. mysqli 扩展_MySQLi的优势
  9. linux安装多路径报错,Linux操作系统配置多路径通用教程(适用于(RHEL,CentOS,SuSE等)...
  10. 苹果cmsv10精仿迅播影院2tu风格主题模板
  11. 《统计学习方法》的Python 3.6复现,实测可用
  12. gin 打linux环境包问题解决
  13. 远程sun服务器,向日葵远程控制(com.oray.sunlogin) - 11.1.0.39347 - 应用 - 酷安
  14. window 平台下mysql主从的监控(window执行计划配合vb脚本)
  15. 佐藤hiroko-爱拯救了我(步之物语)
  16. 通用的电子商务商城后台管理界面模板(可下载)
  17. 欧姆龙CP1H+CIF11与施耐德ATV变频器通讯程序
  18. html静态页面兼职,兼职.html · teayork/master - Gitee.com
  19. ie的js调试工具companion.js使用方法
  20. 虚幻4皮肤材质_UE4实时虚拟角色材质篇之Skin Material(一)

热门文章

  1. 关于书籍“Composing Programs”1.6.3自定义函数的嵌套定义与非嵌套定义的比较
  2. sampler采样器记录
  3. C语言指针 — 函数指针
  4. 「趣小面」寻融资:前景美好,“钱”景难说
  5. 【待写】x265:CRF、ABR、CQP码控模式性能测试
  6. python移动光标至行首_Python re.sub()行首开始锚定
  7. 农场渲染文件服务器搭建,渲染3d渲染农场云服务器
  8. 矩阵的奇异值分解过程
  9. UDP TCP socket EtherCAT都是什么?
  10. Rust 用于 STM32 开发