Activiti流程定义缓存源码分析7-流程缓存自定义

接下来,重点看一下Activiti中如何自定义流程缓存。

      上面我们提到过自定义类首先需要继承StandaloneProcessEngineConfiguration类并通过动态属性注入方式为引擎配置类注入processDefinitionInfoCache属性值。实现代码如清单x-所示。

代码清单x-MyStandaloneProcessEngineConfiguration.java

---------------------------------------------------------------------------------------------------------------------------

MyStandaloneProcessEngineConfiguration.java

public class MyStandaloneProcessEngineConfiguration extends StandaloneProcessEngineConfiguration { #-1

//设置processDefinitionInfoCache对象的值

public void setProcessDefinitionInfoCache(ProcessDefinitionInfoCache cache) {

super.processDefinitionInfoCache=cache;

}

}

activiti.cfg.xml

 <bean id="processEngineConfiguration"

class="com.shareniu.activiti.learing.ch14.infoache.MyStandaloneProcessEngineConfiguration">  

<!-- 必须开启允许流程定义节点的缓存才可以使用节点缓存特性-->

   <property name="enableProcessDefinitionInfoCache" value="true"></property> #-2

      <property name="configurators" > #-3

  <list>

<!-- 自定义动态属性注入类-->

<beanclass="com.shareniu.activiti.learing.ch14.infoache.MyProcessEngineConfigurator"></bean>

   </list>

    </property>

        </bean>

MyProcessEngineConfigurator.java

public class MyProcessEngineConfigurator implements ProcessEngineConfigurator  { #-4

//自定义的引擎类。

MyStandaloneProcessEngineConfiguration a;

//自定义节点缓存类。

MyProcessDefinitionInfoCache cache;

public void beforeInit(ProcessEngineConfigurationImpl pc) { #-5

a=(MyStandaloneProcessEngineConfiguration)pc;

cache=new MyProcessDefinitionInfoCache(a.getCommandExecutor());

a.setProcessDefinitionInfoCache(cache);

}

public void configure(ProcessEngineConfigurationImpl pc) { #-6

 a=(MyStandaloneProcessEngineConfiguration)pc;

 cache.setCommandExecutor(a.getCommandExecutor());

a.setProcessDefinitionInfoCache(cache);

}

public int getPriority() {//如果存在多个动态属性注入类,根据该方法返回值决定类执行的先后顺序

return 0;

}

}

---------------------------------------------------------------------------------------------------------------------------

你会发现,代码的处理逻辑还是非常清晰的。首先我们在#-1中提供设置processDefinitionInfoCache属性的函数,该函数非常的简单,直接根据参数值设置父类的属性值。通过该函数我们就可以实现将自定义的属性值注入到流程引擎配置类中。#-2中开始进行流程定义节点缓存,如果该属性值设置为false,则流程引擎不支持节点缓存。使用自定义的流程引擎配置类并为该类设置动态属性注入工作如#-3所示。#-4将自定义的动态属性值设置到流程引擎配置类实例,可能读者有个疑问?通过上面的代码我们发现了beforeInit函数以及configure函数都需要设置MyProcessDefinitionInfoCache类中的命令执行器参数值,是不是多此一举呢?这个地方我们就要回顾一下ProcessEngineConfigurationImpl类中的init()函数初始化先后顺序并梳理如下。

  1. configuratorsBeforeInit()。

该函数负责遍历所有的动态属性注入类并依此调用类中的beforeInit函数如#-5所示。

  1. initCommandExecutors()。

初始化命令调度者,命令执行器。

  1. initDeployers()。

初始化各种缓存类,如果用户自定义缓存类,则优先使用。

  1. configuratorsAfterInit()。

该函数负责遍历所有的动态属性注入类并依此调用类中的configure函数如#-6所示。

根据上面引擎初始化过程我们知道,如果我们在#-5函数中没有进行节点缓存类的注入工作,则initDeployers函数就直接使用系统内置的节点缓存类。所以#-5步骤还是非常有必要的,而且是必不可少的一个环节。该步骤明确告诉流程引擎我要使用自定义的类进行处理,由于initCommandExecutors函数在#-5之后才开始进行初始化,所以引擎中的命令执行器实例对象在#-5函数中是无法获取到的,因此我们在这里的实现只能灵活变通一下,首先将自定义类注入到流程引擎配置类并且将命令执行器设置为空(这个时候还无法获取到该实例对象),然后在configuratorsAfterInit函数中获取到命令执行器并重新将其重新设置到cache对象。

需要强调一点beforeInit和configure函数操作的cache对象必须为同一个,否则后续使用的时候可能出问题。

技术团队支持:盘古BPM工作流平台

具体效果参考盘古BPM

 

 

发布了206 篇原创文章 · 获赞 580 · 访问量 177万+

猜你喜欢

转载自blog.csdn.net/qq_30739519/article/details/104215512