自定义ProcessEngineConfiguration
了解ProcessEngineConfiguration的属性配置及其作用,可以使我们定制出个性化的流程引擎。如果想进一步对流程引擎做更个性化的定制,可以为ProcessEngineConfiguration配置不同的实现。
ProcessEngineConfiguration及其子类
ProcessEngineConfiguration代表Activiti的一个配置实例,ProcessEngineConfiguration本身是一个抽象类,因此要配置bean需要知道它的子类。在定制自己的ProcessEngineConfiguration之前,我们先来了解它及其几个子类:
如上图所示,ProcessEngineConfiguration是全部配置类的父类,它有一个ProcessEngineConfigurationImpl子类,这个子类也是个抽象类,在这三个子类下面又有三个直接子类。
org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration:使用该类作为配置对象,Activiti将会对事务进行管理,默认情况下,流程引擎启动时会检查数据库结构以及版本是否正确。
org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration:该类同样由Activiti进行事务管理,但是该类设置了databaseSchemaUpdate(create-drop)和jdbcUrl(jdbc:h2:mem:activiti)属性,以便可以在单元测试中使用。
org.activiti.spring.SpringProcessEngineConfiguration:当Activiti与Spring进行整合时,可以使用该类。
org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration:不使用Activiti的事务,使用JTA进行事务管理。
自定义ProcessEngineConfiguration
如果我们想自定义一个ProcessEngineConfiguration抽象类可以选择继承ProcessEngineConfiguration或者它的直接子类ProcessEngineConfigurationImpl。
继承ProcessEngineConfiguration类需要实现buildProcessEngine方法,继承ProcessEngineConfigurationImpl需要实现getDefaultCommandInterceptorsTxRequired和getDefaultCommandInterceptorsTxRequiresNew方法。如果需要添加自定义属性,可以为自己的ProcessEngineConfiguration类添加属性,并且添加相应的setter方法。
public class MyProcessEngineConfiguration extends ProcessEngineConfigurationImpl {
public MyProcessEngineConfiguration() {
// 自定义设置
}
//定义了一个userName测试属性,需要在processEngineConfiguration注入
private String userName;
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserName() {
return this.userName;
}
@Override
protected CommandInterceptor createTransactionInterceptor() {
return new MyInterceptorA();
}
@Override
protected Collection<? extends CommandInterceptor> getDefaultCommandInterceptors() {
List<CommandInterceptor> interceptors = new ArrayList<CommandInterceptor>();
interceptors.add(new LogInterceptor());
CommandInterceptor transactionInterceptor = createTransactionInterceptor();
if(transactionInterceptor!=null) {
interceptors.add(transactionInterceptor);
}
interceptors.add(new MyInterceptorB());
interceptors.add(new CommandContextInterceptor(commandContextFactory,this));
return interceptors;
}
}