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

开发工具: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—-操作用户表、组表、关系表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值