前面的文章介绍了Activiti的流程部署。本章我们会将Activiti和Spring进行整合,并完成简单的审批和查询。
1、要实现Spring和整合,还需要引入activiti-spring包,pom的依赖如下:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.4</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-engine-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>6.0.0</version>
</dependency>
2、Activiti的配置文件:
<?xmlversion="1.0" encoding="UTF-8"?>
<beansxmlns="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.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass"value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/oasys?useUnicode=true&characterEncoding=UTF-8&useSSL=true"/>
<property name="user" value="root" />
<property name="password" value="123456"/>
</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"/>
<property name="databaseSchemaUpdate"value="true"/>
</bean>
<!-- 流程引擎 -->
<bean id="processEngine"class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration"ref="processEngineConfiguration"/>
</bean>
<!-- TaskService对象-->
<bean id="taskService"factory-bean="processEngine"factory-method="getTaskService"/>
<!--RuntimeService对象-->
<bean id="runtimeService" factory-bean="processEngine"factory-method="getRuntimeService"/>
<!-- RepositoryService对象-->
<bean id="repositoryService"factory-bean="processEngine"factory-method="getRepositoryService"/>
<!-- HistoryService对象-->
<bean id="historyService" factory-bean="processEngine"factory-method="getHistoryService"/>
</beans>
注意:在Activiti的配置文件中配置了几种主要的服务对象
Service服务说明
RepositoryService仓库服务
仓库服务是存储相关的服务,一般用来部署流程文件,获取流程文件,查询流程定义信息等操作,是引擎中的一个重要的服务。
创建方法:
RepositoryService repositoryService =engine.getRepositoryService();
运行时服务
流程运行时的流程实例,流程定义,流程版本,流程节点等信息,使用运行时服务操作,是引擎中的一个重要的服务
创建方法:
RuntimeService runtimeService =engine.getRuntimeService();
任务服务
流程运行时的会产生任务,接收、办理、完成等操作使用任务服务完成,是引擎中的一个重要的服务
创建方法:
TaskService taskService =engine.getTaskService();
3、Spring的配置文件:
<?xml version="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置数据库连接池 -->
<bean id="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass"value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/oasys?useUnicode=true&characterEncoding=UTF-8&useSSL=true"/>
<property name="user" value="root" />
<property name="password" value="123456"/>
</bean>
<!-- Spring和MyBatis整合,代替MyBatis配置文件 -->
<bean id="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 扫描mapper文件 -->
<property name="mapperLocations"
value="classpath:mapper/*.xml"/>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 ,包下的类需要使用@MapperScan注解,否则容器注入会失败 -->
<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage"value="com.qf.oa.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!-- 配置Spring自动扫描包中的类-->
<context:component-scan base-package="com.qf.oa">
<!-- 排除带Controller注解的类-->
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 导入Activiti的配置 -->
<import resource="activiti.cfg.xml"/>
</beans>
4、启动个人任务
给流程添加审批人
单元测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")
public class ProcessTest {
@Autowired
private TaskServicetaskService;
@Autowired
private RuntimeServiceruntimeService;
@Autowired
private HistoryServicehistoryService;
@Autowired
private RepositoryServicerepositoryService;
//部署流程
@Test
public voiddeployAddSigninProcess() {
repositoryService.createDeployment()
.key("addsignin_process")
.addClasspathResource("bpmn/proc_addsignin.bpmn")
.addClasspathResource("bpmn/proc_addsignin.png")
.name("补签流程")
.deploy();
}
//启动流程
@Test
public void startProcess(){
runtimeService.startProcessInstanceByKey("addsignin_process");
}
//查询个人任务
@Test
public void queryTask(){
TaskQuery taskQuery = taskService.createTaskQuery();
//按照审批人和流程id查询
taskQuery.taskAssignee("张三");
taskQuery.processDefinitionKey("addsignin_process");
List<Task> list = taskQuery.list();
for (Task task : list) {
System.out.println(task.getId());
System.out.println(task.getAssignee());
System.out.println(task.getName());
System.out.println(task.getOwner());
System.out.println(task.getCategory());
System.out.println(task.getCreateTime());
System.out.println(task.getExecutionId());
System.out.println(task.getTaskDefinitionKey());
System.out.println(task.getProcessDefinitionId());
}
}
//完成任务
@Test
public void completeTask(){
//通过TaskID完成任务
taskService.complete("2501");
System.out.println("完成任务");
}
}
以上我们通过Spring整合了Activiti,并且实现了基本的Activiti流程的启动、查询和完成。