转载请注明出处 https://www.cnblogs.com/rolayblog/p/10444866.html
背景
某天有同事反映,审批记录中看到该他审批,但是待办里面却没有待办事项,于是看服务器日志,找到了问题所在。业务代码报错,已经抛出了异常,但是流程还是继续往下走了,完全不受@Transactional注解影响,看到这里就知道问题在哪里了,此时我用的正是默认获取流程引擎对象的方式,Activiti大佬和Spring大佬自己做自己的,不行要把它们掰弯,强行在一起。于是翻阅《Activiti 权威指南》找到了解决方法,买了这本书就没有怎么看过,只是遇到问题了才翻一翻。另外,感谢分享牛大佬的提醒。
Tip
了解activiti的道友们应该都知道,流程引擎的配置文件放在resources下,可以直接通过ProcessEngines.getDefaultProcessEngine()方法直接获取流程引擎对象,亦或者通过ProcessEngineConfiguration.createProcessEngineConfigurationFromInputStream()读取其他位置的配置文件,但是呢,咋们既然用了强大的Sring,像事务、流程引擎对象的管理甚至流程引擎内部的API都交给统统交给它吧!进入正题吧。
Maven
我这里排除了spring-context,因为项目里面用的spring是高版本的,但是Activiti 5.22只能引用这个版本的activiti-spring,可根据自己需要删除。
1 <dependency> 2 <groupId>org.activiti</groupId> 3 <artifactId>activiti-spring</artifactId> 4 <version>5.22.0</version> 5 <exclusions> 6 <exclusion> 7 <groupId>org.springframework</groupId> 8 <artifactId>spring-context</artifactId> 9 </exclusion> 10 </exclusions> 11 </dependency>
流程引擎配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 5 <!--配置数据源--> 6 <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 7 <property name="driverClass" value="com.mysql.jdbc.Driver"/> 8 <property name="url" value="jdbc:mysql://数据库地址"/> 9 <property name="username" value="账号"/> 10 <property name="password" value="密码"/> 11 </bean> 12 <!--流程引擎配置--> 13 <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> 14 <property name="dataSource" ref="dataSource"/> 15 <property name="databaseSchemaUpdate" value="false"/> 16 </bean> 17 </beans>
Spring 配置文件
这里面加入了流程引擎,和几个Service。
1 <!--Spring流程引擎配置--> 2 <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> 3 <property name="dataSource" ref="dataSource"/> 4 <property name="databaseSchemaUpdate" value="false"/> 5 <property name="transactionManager" ref="transactionManager"/> 6 <property name="idGenerator" ref="uuidGenerator"/> 7 </bean> 8 <!--自定义ID生成--> 9 <bean id="uuidGenerator" class=""/> 10 <!--Spring流程引擎--> 11 <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> 12 <property name="processEngineConfiguration" ref="processEngineConfiguration"/> 13 </bean> 14 <!--流程引擎服务--> 15 <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/> 16 <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/> 17 <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService"/> 18 <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/> 19 <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/>
至此就配置完成了,可以在代码里面通过@Autowired获取流程引擎或者API了,事务也统一管理了。