开发工具:eclipse
框架:Activiti 5.13
项目:普通Java项目
eclipse使用Avtiviti框架需要安装插件,我在另一篇文章已经写过了,就不在这里介绍
接下来是介绍Activiti的入门案例,即API的使用
工作流框架底层需要有数据库支持,activiti5.13版本对应23张表,activiti框架底层使用mybatis操作数据库。
JBPM4.4底层18张表,底层使用hibernate操作数据库。
第一步:创建Activiti的23张表
方法一:手动创建(建议)
根据不同数据库选择相应的sql文件,并执行后创建
方法二:使用框架自动创建(不建议)
1:创建Java项目并导入jar包
(导入activiti提供的示例rest里的44个jar包,注意:还需要再导入mysql-connector-java-5.1.5-bin.jar)
2:提供配置文件
<!-- activiti-context.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!-- 流程引擎配置对象 -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///activiti_day1"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="root"/>
<!-- 配置自动创建表 -->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
<!-- 使用工厂创建流程引擎对象 -->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
</beans>
3:创建流程引擎对象,自动建表
/**
* 使用框架提供的自动建表方式创建23张表
*/
@Test
public void test1() {
String resource = "activiti-context.xml";// 配置文件
String beanName = "processEngineConfiguration";
// 读取配置文件,获得配置对象
ProcessEngineConfiguration config = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource, beanName);
ProcessEngine processEngine = config.buildProcessEngine();
}
/**
* 使用默认配置
* 1、配置文件必须在classpath根目录下
* 2、配置文件名称必须为activiti-context.xml或者activiti.cfg.xml
* 3、配置文件中配置对象的id必须为processEngineConfiguration
* 4、工厂对象的id必须为processEngine
*/
@Test
public void test2() {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
}
第二步:使用API操作流程
使用插件设计一个流程图:(完成后在src下生成qjlc.bpmn以及qjlc.png文件)
第三步:编码
/**
* 部署流程定义 方式一:加载单个的流程定义文件 方式二:加载zip文件
* 操作的数据表:act_re_deployment(部署表)、act_re_procdef(流程定义表)、act_ge_bytearray(二进制表)
* @throws FileNotFoundException
*/
@Test
public void test1() throws FileNotFoundException {
DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
// 方式一:加载单个的流程定义文件
// deploymentBuilder.addClasspathResource("qjlc.bpmn");
// deploymentBuilder.addClasspathResource("qjlc.png");
// Deployment deployment = deploymentBuilder.deploy();
// 方式二:加载zip文件
// 加载src下的process.zip
//ZipInputStream zipInputStream = new ZipInputStream(this.getClass().getClassLoader().getResourceAsStream("process.zip"));
// 加载指定文件(建议)
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(new File("d:\\process.zip")));
deploymentBuilder.addZipInputStream(zipInputStream );
deploymentBuilder.deploy();
}
/**
* 查询流程定义
* 操作的数据表:act_re_procdef
*/
@Test
public void test2(){
ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
query.processDefinitionKey("qjlc");//根据key过滤
query.orderByProcessDefinitionVersion().asc();//根据流程定义版本升序
List<ProcessDefinition> list = query.listPage(0, 10);//分页查询
for (ProcessDefinition processDefinition : list) {
System.out.println(processDefinition.getId());
}
}
/**
* 根据流程定义启动流程实例
* 方式一:根据流程定义id启动流程实例
* 方式二:根据流程定义key启动流程实例(建议)-----可以根据当前最新版本的流程定义启动流程实例
* 操作的数据表:act_ru_execution(流程实例表)、act_ru_task(任务表)
*/
@Test
public void test3() throws Exception{
//方式一:根据流程定义id启动流程实例
//String processDefinitionId = "";//流程定义id
//processEngine.getRuntimeService().startProcessInstanceById(processDefinitionId);
String processDefinitionKey = "qjlc";
//方式二:根据流程定义key启动流程实例
ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);
System.out.println(processInstance.getId() + " " + processInstance.getProcessDefinitionId());
}
/**
* 查询流程实例
* 操作的数据表:act_ru_execution(流程实例表)
*/
@Test
public void test4() throws Exception{
List<ProcessInstance> list = processEngine.getRuntimeService().createProcessInstanceQuery().list();
for (ProcessInstance processInstance : list) {
System.out.println(processInstance.getId());
}
}
/**
* 删除流程实例
* 操作的数据表:act_ru_execution(流程实例表)、act_ru_task(任务表)
*/
@Test
public void test5() throws Exception{
String processInstanceId = "1201";
String deleteReason = "不请假了";
processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, deleteReason);
}
/**
* 查询个人任务
* 操作的数据表:act_ru_task(任务表)
*/
@Test
public void test6() throws Exception{
TaskQuery query = processEngine.getTaskService().createTaskQuery();
query.taskAssignee("张三");//查询责任人张三的所有任务
query.orderByTaskCreateTime().desc();//根据任务时间降序
List<Task> list = query.list();
for (Task task : list) {
System.out.println(task.getId());
}
}
/**
* 办理个人任务
* 操作的数据表:act_ru_execution(流程实例表)、act_ru_task(任务表)
*/
@Test
public void test7() throws Exception{
String taskId = "1304";
processEngine.getTaskService().complete(taskId);
}
以下两个方法用于查询对应的png图片以及输出,应用场景:动态查询并显示对应的流程图
/**
* 根据**部署ID**查询部署对应的流程定义文件名称和输入流
* @throws FileNotFoundException
*/
@Test
public void test8() throws Exception{
String deploymentId = "201";//部署id
List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
for (String name : names) {//可以查询到对应的.bpmn以及.png
InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name);
FileUtils.copyInputStreamToFile(in, new File("d:\\"+name));
in.close();
}
}
/**
* 根据**流程定义ID**查询部署对应的流程定义输入流
* @throws FileNotFoundException
*/
@Test
public void test9() throws Exception{
String processDefinitionId = "qjlc:6:904";//流程定义id
InputStream pngStream = processEngine.getRepositoryService().getProcessDiagram(processDefinitionId);
FileUtils.copyInputStreamToFile(pngStream, new File("d:\\abc.png"));//只能取到对应的.png输入流
}
API总结
1.几个接口(和表有对应关系):
ProcessDefinition—–act_re_procdef
ProcessInstance——act_ru_execution
Task—–act_ru_task
2.几个Query对象
DeploymentQuery——act_re_deployment
ProcessDefinitionQuery—–act_re_procdef
TaskQuery—–act_ru_task
3.几个Service
RepositoryService—-操作部署表、流程定义表等静态资源信息表
RuntimeService—-操作流程实例表、任务表等动态信息表
TaskService—–操作任务表
HistoryService—-操作历史表 IdentityService—-操作用户表、组表、关系表