activiti学习笔记(十一)之集成spring

2018-09-27  本文已影响24人  云师兄

activiti配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="jdbc:mysql://localhost:3306/db_activiti"/>
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="username" value="root"/>
        <property name="password" value="abc123"/>
    </bean>

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="dataSource"/>
    </bean>

    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="dataSource" ref="dataSource"/>
        <property name="transactionManager" ref="transactionManager"/>
    </bean>

    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
    </bean>

    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>
    <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/>
    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/>
    <bean id="formService" factory-bean="processEngine" factory-method="getFormService"/>
</beans>

配置如上,配置流程引擎对象时基于SpringProcessEngineConfiguration类来完成,即可实现Spring和activiti的集成, processEngineConfiguration这个bean有数据源和事务管理器两个属性,分别有特定的配置。最终在创建流程引擎对象的时候,会引入流程引擎配置对象来创建流程引擎实例。
基于流程引擎工厂类ProcessEngineFactoryBean创建流程引擎后,就可以使用这个工厂类和工厂方法创建配置最后面的几个service实例。这样在使用过程中就可以直接注入我们需要的service来用了:

@Autowired
public RepositoryService repositoryService;

后续

接着来看下Spring流程配置类的实现,它继承于ProcessEngineConfigurationImpl,事务相关的代码如下:

public CommandInterceptor createTransactionInterceptor() {
        if (this.transactionManager == null) {
            throw new ActivitiException("transactionManager is required property for SpringProcessEngineConfiguration, use " + StandaloneProcessEngineConfiguration.class.getName() + " otherwise");
        } else {
            return new SpringTransactionInterceptor(this.transactionManager);
        }
    }

可以看到,如果配置了事务管理器,将基于这个事务管理器闯将Spring的事务拦截器,拦截器的代码如下:

public class SpringTransactionInterceptor extends AbstractCommandInterceptor {
    private static final Logger LOGGER = LoggerFactory.getLogger(SpringTransactionInterceptor.class);
    protected PlatformTransactionManager transactionManager;

    public SpringTransactionInterceptor(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

    public <T> T execute(final CommandConfig config, final Command<T> command) {
        LOGGER.debug("Running command with propagation {}", config.getTransactionPropagation());
        TransactionTemplate transactionTemplate = new TransactionTemplate(this.transactionManager);
        transactionTemplate.setPropagationBehavior(this.getPropagation(config));
        T result = transactionTemplate.execute(new TransactionCallback<T>() {
            public T doInTransaction(TransactionStatus status) {
                return SpringTransactionInterceptor.this.next.execute(config, command);
            }
        });
        return result;
    }

    private int getPropagation(CommandConfig config) {
        switch(config.getTransactionPropagation()) {
        case NOT_SUPPORTED:
            return 4;
        case REQUIRED:
            return 0;
        case REQUIRES_NEW:
            return 3;
        default:
            throw new ActivitiIllegalArgumentException("Unsupported transaction propagation: " + config.getTransactionPropagation());
        }
    }
}

其中涉及Spring事务相关的知识,将会在另外一篇博客中仔细讨论,此处就先不深入了。

上一篇下一篇

猜你喜欢

热点阅读