flowable修改流程缓存实现自由流程
flowable中会对流程定义做缓存处理,在实现自由流程的时候需要动态给流程定义添加节点,默认的是对流程定义做的缓存,要想在每个流程实例中动态添加节点,可以通过修改流程缓存,添加每个流程实例的缓存
涉及到的类
主要步骤
- 步骤1:修改BpmnJsonConverter,添加自定义属性,区分流程是否为自由流程
- 步骤2:设置全局的FlowableEventListener( FlowableEngineEventType. ACTIVITY_COMPLETED ),在流程启动的时候判断流程是否为自由流程,如果是的话,把流程的bpmnModel转成xml设置到自己定义的缓存对象中,然后保存到redis里。
Redis采用了Hash方式存储,key为流程实例ID,value为自定义缓存类。 - 步骤3:自由流程添加节点的时候提前把流程实例id放在request作用域中
- 步骤4:定义 DefaultDeploymentCache 子类重写get方法,如果是自定义流程并且request作用域中有流程实例id就中redis中获取流程定义json转换成 ProcessDefinitionCacheEntry
- 步骤5:定义自由流程命令类,获取流程定义缓存,给里面添加连线和节点
- 步骤6:往新加的节点上跳转
放入缓存主要代码
if (FlowUtils.isFreeProcess(entity.getProcessDefinitionId())) {
//放入缓存
ProcessDefinitionCacheEntry processDefinitionCacheEntry = managementService.executeCommand(new GetProcessDefinitionCacheEntryCmd(entity.getProcessDefinitionId()));
CustomProcessDefinitionCacheEntry customProcessDefinitionCacheEntry = FlowUtils.parseCustomProcessDefinitionCacheEntry(processDefinitionCacheEntry);
FreeProcessCaChe cache = SpringUtil.getBean(FreeProcessCaChe.class);
cache.add(entity.getProcessInstanceId(), customProcessDefinitionCacheEntry);
}
下方为以上用到的类以及方法
- 获取缓存命令类
public class GetProcessDefinitionCacheEntryCmd implements Command<ProcessDefinitionCacheEntry> {
protected String processDefinitionId;
public GetProcessDefinitionCacheEntryCmd(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
}
@Override
public ProcessDefinitionCacheEntry execute(CommandContext commandContext) {
DeploymentManager deploymentManager = CommandContextUtil.getProcessEngineConfiguration().getDeploymentManager();
ProcessDefinitionCacheEntry processDefinitionCacheEntry = deploymentManager.getProcessDefinitionCache()
.get(processDefinitionId);
return processDefinitionCacheEntry;
}
}
- 序列化缓存对象方法
public static CustomProcessDefinitionCacheEntry parseCustomProcessDefinitionCacheEntry(ProcessDefinitionCacheEntry processDefinitionCacheEntry) {
CustomProcessDefinitionCacheEntry customProcessDefinitionCacheEntry = new CustomProcessDefinitionCacheEntry();
ProcessDefinition processDefinition = processDefinitionCacheEntry.getProcessDefinition();
String resourceName = processDefinition.getResourceName();
String deploymentId = processDefinition.getDeploymentId();
BpmnModel bpmnModel = processDefinitionCacheEntry.getBpmnModel()