美文网首页
activiti学习笔记(十一)之集成spring

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

作者: 云师兄 | 来源:发表于2018-09-27 20:28 被阅读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事务相关的知识,将会在另外一篇博客中仔细讨论,此处就先不深入了。

    相关文章

      网友评论

          本文标题:activiti学习笔记(十一)之集成spring

          本文链接:https://www.haomeiwen.com/subject/tkmjoftx.html