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事务相关的知识,将会在另外一篇博客中仔细讨论,此处就先不深入了。