欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

自定义ProcessEngineConfiguration

程序员文章站 2022-03-11 11:05:55
...

了解ProcessEngineConfiguration的属性配置及其作用,可以使我们定制出个性化的流程引擎。如果想进一步对流程引擎做更个性化的定制,可以为ProcessEngineConfiguration配置不同的实现。

 

ProcessEngineConfiguration及其子类

ProcessEngineConfiguration代表Activiti的一个配置实例,ProcessEngineConfiguration本身是一个抽象类,因此要配置bean需要知道它的子类。在定制自己的ProcessEngineConfiguration之前,我们先来了解它及其几个子类:

自定义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;
    }
}