activiti-api-impl
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相关推荐
- activiti 入门——activiti API (二)
上一篇介绍了activiti,以及一个简单的demo.估计很多刚接触activiti的小伙伴还是迷迷糊糊的,这篇会详细介绍activiti API相信看完之后会为你解决之前的困惑. activiti ...
- activiti api文档_【白银人机】Activiti 工作流从入门到入土:完整 hello world 大比拼(API 结合实例讲解)...
点击上方"好好学java",选择"置顶"公众号 重磅资源.干货,第一时间送达 重磅推荐 ① 纯福利 | 公众号资源大汇总,一年才一次! ② 重磅!!2018年 ...
- 解决工作流:org.activiti.engine.ActivitiException: Unknown property used in expression: ${AAAAA}报错
工作流流向有一个以上的流的方向的时候,必须指定流向,默认时用EL表达式表示,比如一个节点既可以流到A5也可以流到A6,当业务需要流向A5 的时候须指定流转条件${A5} 一条流程有多个流转条件的时候, ...
- [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 ...
- JAVAWEB开发之工作流详解(一)——Activiti的环境搭建、插件安装、核心API
工作流的概念 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息或任 ...
- JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成
管理流程定义 设计流程定义文档 bpmn文件 设置方式可以直接使用插件图形化界面进行设置 为某任务节点指定任务执行者 保存后的BPMN文件可以使用XML编辑器打开 BPMN 2.0根节点是defini ...
- Liferay7 BPM门户开发之11: Activiti工作流程开发的一些统一规则和实现原理(完整版)...
注意:以下规则是我为了规范流程的处理过程,不是Activiti公司的官方规定. 1.流程启动需要设置启动者,在Demo程序中,"启动者变量"名统一设置为initUserId 启动时 ...
- 工作流引擎 Activiti 实战系列
Activiti整合Spring 一.Activiti与Spring整合开发 1.1 Activiti与Spring整合的配置 1).在pom.xml文件引入坐标 如下 <properties& ...
- 工作流引擎 Activiti 万字详细进阶
Activiti进阶 一.流程实例 什么是流程实例 流程实例(ProcessInstance)代表流程定义的执行实例. 一个流程实例包括了所有的运行节点.我们可以利用这个对象来了解当前流程实例的进度等 ...
- Activiti 5.1.4最佳实践
1.简单介绍 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度. Activiti 作为一个遵从 Apache 许可的工作流和业 ...
最新文章
- iOS调用系统相机文字改为中文
- D~信息学/计算机专业操作
- Chrome插件-新浪微博阅读器
- python matplotlib.pyplot() plt() 如何限制坐标的上下限?plt.xlim() plt.ylim()
- Xcode更改ios app图标
- scrapy从入门到放弃 学习项目2
- kotlin中学习笔记——null
- mysqli 扩展_MySQLi的优势
- linux安装多路径报错,Linux操作系统配置多路径通用教程(适用于(RHEL,CentOS,SuSE等)...
- 苹果cmsv10精仿迅播影院2tu风格主题模板
- 《统计学习方法》的Python 3.6复现,实测可用
- gin 打linux环境包问题解决
- 远程sun服务器,向日葵远程控制(com.oray.sunlogin) - 11.1.0.39347 - 应用 - 酷安
- window 平台下mysql主从的监控(window执行计划配合vb脚本)
- 佐藤hiroko-爱拯救了我(步之物语)
- 通用的电子商务商城后台管理界面模板(可下载)
- 欧姆龙CP1H+CIF11与施耐德ATV变频器通讯程序
- html静态页面兼职,兼职.html · teayork/master - Gitee.com
- ie的js调试工具companion.js使用方法
- 虚幻4皮肤材质_UE4实时虚拟角色材质篇之Skin Material(一)
热门文章
- 关于书籍“Composing Programs”1.6.3自定义函数的嵌套定义与非嵌套定义的比较
- sampler采样器记录
- C语言指针 — 函数指针
- 「趣小面」寻融资:前景美好,“钱”景难说
- 【待写】x265:CRF、ABR、CQP码控模式性能测试
- python移动光标至行首_Python re.sub()行首开始锚定
- 农场渲染文件服务器搭建,渲染3d渲染农场云服务器
- 矩阵的奇异值分解过程
- UDP TCP socket EtherCAT都是什么?
- Rust 用于 STM32 开发