Activiti工作流的学习

因为现在所处的公司要实现一个流程的审批,也是因为以前有过一些Activiti工作流的使用经验,所以我选择了Activiti工作流,不同的是以前是一个已有的框架,只会用一些流程的执行而不知道为什么这么用,而现在要学习怎么用,特别感谢一位大佬的博客。
https://blog.csdn.net/zjx86320/article/category/6294649

从零开始引入Activiti我是这样做的

第一步

下载Activiti工作流
官网:https://www.activiti.org/download-links
下载后目录结构如下:
这里写图片描述

在database中找到对应数据库SQL至数据库建表,我下载的版本建了28张表。

第二步

把libs中包导至项目中(包中含el表达式会和tomcat的lib中的冲突),通过maven导入,获修改tomcat中的el表达式源码

 <!--工作流,去除依赖,因为和tomcat的jar冲突 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>6.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>de.odysseus.juel</groupId>
                    <artifactId>juel-spi</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>6.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.170</version>
            <scope>test</scope>
        </dependency>

我后来采取的maven

第三步

配置activiti-context-xml文件 或 activiti-cfg-xml 文件,简单看了一下源码,中间有明确写到文件名,应该是不能用其他名字的
源码中也是有方法可以传入String来加载ProcessEngine(最核心的类)的,所有其他类基本都由它来生产。
获取的方式是

private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

activiti-context-xml文件如下

<beans xmlns="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="dbProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location" value="classpath:jdbc.properties"/>
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
    </bean>-->

    <!--数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/newssm"/>
        <property name="username" 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"/>
        <property name="mailServerHost" value="localhost"/>
        <property name="mailServerPort" value="5025"/>
    </bean>

    <!--流程引擎配置-->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
    </bean>

</beans>

下面是一些简单的测试方法,可转化为静态方法使用。

package com.cjdjyf.newssm.utils;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author : cjd
 * @description :
 * @date : 2018/5/7 21:35
 */
public class ActivitiUtil {
    private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();


    //部署流程
    @Test
    public void deployProcessDefinition() throws FileNotFoundException {
        //获取资源路径
        String bpmn = "house_least.bpmn";
        String png = "house_least.png";

        Deployment deployment = processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
                .createDeployment()//创建部署对象
                .addInputStream("bpmn", new FileInputStream("D:/" + bpmn))
                .addInputStream(png, new FileInputStream("D:/" + png))
                .deploy();//完成部署
        System.out.println("部署ID:" + deployment.getId());//1
        System.out.println("部署时间:" + deployment.getDeploymentTime());
    }

    //开启流程
    @Test
    public void startProcessInstance() {
        Map<String, Object> map = new HashMap<>();
        map.put("decideType", 2);
        ProcessInstance pi = processEngine.getRuntimeService()//管理流程实例和执行对象,也就是表示正在执行的操作
                .startProcessInstanceByKey("myProcess_1", map);按照流程定义的key启动流程实例

        System.out.println("流程实例ID:" + pi.getId());//流程实例ID:101
        System.out.println("流程实例ID:" + pi.getProcessInstanceId());//流程实例ID:101
        System.out.println("流程实例ID:" + pi.getProcessDefinitionId());//myMyHelloWorld:1:4
    }

    //查找流程
    @Test
    public void findPersonnelTaskList() {
        String assignee = "张三";//当前任务办理人
        List<Task> tasks = processEngine.getTaskService()//与任务相关的Service
                .createTaskQuery()//创建一个任务查询对象
                /*.taskAssignee(assignee)*/
                .list();
        if (tasks != null && tasks.size() > 0) {
            for (Task task : tasks) {
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务的办理人:" + task.getAssignee());
                System.out.println("任务名称:" + task.getName());
                System.out.println("任务的创建时间:" + task.getCreateTime());
                System.out.println("任务ID:" + task.getId());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("#####################################");
            }
        }
    }

    //完成任务
    @Test
    public void completeTask() {
        String taskID = "17506";
        processEngine.getTaskService().complete(taskID);
        System.out.println("完成任务:" + taskID);

    }

    // 查询流程定义
    @Test
    public void findProcessDifinitionList() {
        List<ProcessDefinition> list = processEngine.getRepositoryService()
                .createProcessDefinitionQuery()
                // 查询条件
                .processDefinitionKey("myProcess_1")// 按照流程定义的key
                // .processDefinitionId("helloworld")//按照流程定义的ID
                .orderByProcessDefinitionVersion().desc()// 排序
                // 返回结果
                // .singleResult()//返回惟一结果集
                // .count()//返回结果集数量
                // .listPage(firstResult, maxResults)
                .list();// 多个结果集

        if (list != null && list.size() > 0) {
            for (ProcessDefinition pd : list) {
                System.out.println("流程定义的ID:" + pd.getId());
                System.out.println("流程定义的名称:" + pd.getName());
                System.out.println("流程定义的Key:" + pd.getKey());
                System.out.println("流程定义的部署ID:" + pd.getDeploymentId());
                System.out.println("流程定义的资源名称:" + pd.getResourceName());
                System.out.println("流程定义的版本:" + pd.getVersion());
                System.out.println("########################################################");
            }
        }
    }

    //删除流程定义
    @Test
    public void deleteProcessDifinition() {
        //部署对象ID
        String deploymentId = "5001";
        processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
                .deleteDeployment(deploymentId, true);

        System.out.println("删除成功~~~");//使用部署ID删除流程定义,true表示级联删除
    }

    //查看流程定义的资源文件
    @Test
    public void viewPng() throws IOException {
        //部署ID
        String deploymentId = "1";
        //获取的资源名称
        List<String> list = processEngine.getRepositoryService()
                .getDeploymentResourceNames(deploymentId);
        //获得资源名称后缀.png
        String resourceName = "";
        if (list != null && list.size() > 0) {
            for (String name : list) {
                if (name.indexOf(".png") >= 0) {//返回包含该字符串的第一个字母的索引位置
                    resourceName = name;
                }
            }
        }

        //获取输入流,输入流中存放.PNG的文件
        InputStream in = processEngine.getRepositoryService()
                .getResourceAsStream(deploymentId, resourceName);

        //将获取到的文件保存到本地
        FileUtils.copyInputStreamToFile(in, new File("E:/" + resourceName));

        System.out.println("文件保存成功!");
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值