Activiti工作流框架学习二:API示例

开发工具:eclipse

框架:Activiti 5.13

项目:普通Java项目

eclipse使用Avtiviti框架需要安装插件,我在另一篇文章已经写过了,就不在这里介绍

接下来是介绍Activiti的入门案例,即API的使用
Activiti工作流框架学习二:API示例_第1张图片

工作流框架底层需要有数据库支持,activiti5.13版本对应23张表,activiti框架底层使用mybatis操作数据库。
JBPM4.4底层18张表,底层使用hibernate操作数据库。

第一步:创建Activiti的23张表

方法一:手动创建(建议)
根据不同数据库选择相应的sql文件,并执行后创建
Activiti工作流框架学习二:API示例_第2张图片
方法二:使用框架自动创建(不建议)
1:创建Java项目并导入jar包
(导入activiti提供的示例rest里的44个jar包,注意:还需要再导入mysql-connector-java-5.1.5-bin.jar
Activiti工作流框架学习二:API示例_第3张图片
2:提供配置文件


<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文件)
Activiti工作流框架学习二:API示例_第4张图片

第三步:编码

/**
 * 部署流程定义 方式一:加载单个的流程定义文件 方式二:加载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 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 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 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 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—-操作用户表、组表、关系表

你可能感兴趣的:(#,Activiti)