Activiti流程引擎---入门训练


前言

Activiti流程引擎是一项新的基于Apache许可的开源BPM平台,从基础开始构建,意在提供支持新的BPMN 2.0标准,供人们简单方便使用。它其实可以简称为工作流,也就是一个固定的流程模板,它支持对象管理组、定义流程、控制流,广泛用于开发中。话不多说,直接上

一、相关配置及建库建表

1.引入jar包

maven配置jar,JDK版本1.8, 数据库是Mysql,开发工具是idea

 <dependencies>
    <!--JUnit测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <!--- Activiti依赖导入 -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring</artifactId>
        <version>5.18.0</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>5.18.0</version>
        <exclusions>
            <exclusion>
                <artifactId>slf4j-api</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
            <exclusion>
                <artifactId>spring-beans</artifactId>
                <groupId>org.springframework</groupId>
            </exclusion>
            <exclusion>
                <artifactId>jackson-core-asl</artifactId>
                <groupId>org.codehaus.jackson</groupId>
            </exclusion>
            <exclusion>
                <artifactId>commons-lang3</artifactId>
                <groupId>org.apache.commons</groupId>
            </exclusion>
            <exclusion>
                <artifactId>commons-lang3</artifactId>
                <groupId>org.apache.commons</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
    </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.10</version>
        </dependency>
    </dependencies>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

这里我贴上了我的demo的所有的包,自行挑选

2.配置文件

<?xml version="1.0" encoding="UTF-8"?>
<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="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;serverTimezone=UTC&amp;characterEncoding=utf8"></property>
        <property name="jdbcUsername" value="root"></property>
        <property name="jdbcPassword" value="123456"></property>
        <property name="databaseSchemaUpdate" value="true"></property>
    </bean>


</beans>

在resources下配置一下数据库的连接,因为Activiti会自动去建表,配置文件最好取名为activiti.cfg.xml 这样就可以被自动给加载到

3.建Activiti自带的数据库

如果你的配置文件不是上面那个默认的名字,那么就用这个方法,只需要把名字替换成你的配置文件即可
在这里插入图片描述
我更喜欢这种,一步到位的,只要配置文件名字是activiti.cfg.xml,那么就可以用ProcessEngines来做很多事,可以通过ProcessEngines获取Activiti的服务大管家,继而可以得到Activiti相关的服务来操作了,用的地方会非常多,所以建议抽取出来,因为是demo大多copy,这里我就不抽取了
在这里插入图片描述
运行后就得到他们了,hi代表历史数据表,re代表仓库表,ru代表运行时相关数据的表,具体也在这里细说了,可以自行百度
在这里插入图片描述
下面就去搞搞流程图吧

二、流程图相关

这里是碰到坑最多的地方,因为idea实在是对这个流程图确实不太友好,老乱码了,并且不要用idea的社区版,因为功能插件也很少,无法支持流程图全程的操作

1.首先安装插件

找到这个插件安装起来
在这里插入图片描述
如果找不到,就只有去浏览器上下载了,我就是这样,一搜就能找到,下载完成后,就添加到idea中去,操作如下:
在这里插入图片描述

选中到你刚刚下载的插件的包上,点击🆗就好了

在这里插入图片描述

然后会提示重启

在这里插入图片描述
重启之后就能看到可以添加bpmn文件了
在这里插入图片描述

2.画第一个最简单的流程图

将右侧的图标直接拖到中间来,流程开始时绿点,结束是红点选择usertask拖过来,一会儿对流程节点进行定义,将鼠标对准图标的中心黑点,即可对图标之间进行连线
在这里插入图片描述

3.对流程节点定义

请假申请
在这里插入图片描述

请假审批
在这里插入图片描述
给流程取个名,类似于key,后面一些操作会用到
在这里插入图片描述

4.将流程部署起来

注意:
我们目前只有一个bpmn文件,如果直接开始部署,虽然Activiti底层会自动根据这个bpmn文件生成一张对应的png图片,但是会乱码,所以我们需要自己准备一张对应bpmn文件的png图片,就用咱们刚刚画的bpmn文件来转成png,选中我们的bpmn文件将它复制一份放在resources下,后缀改为xml,然后进行下面的操作即可将xml转为png图片
在这里插入图片描述
在这里插入图片描述
如果你的idea没有Diagrams的话,下载一个jbpm插件即可
在这里插入图片描述

这样就得到对应咱们bpmn文件的png图片了,在这可能大家又会遇到png图片乱码问题,可以去百度一下bpmn转png乱码解决方式在这里插入图片描述
接下来继续保存到resources下,这样就得到了
在这里插入图片描述
现在咱们上代码—部署流程

 //获取服务大
    // 管家
    public ProcessEngine getProcessEngine() {
        return ProcessEngines.getDefaultProcessEngine();
    }

    //部署流程
    @Test
    public void deployProcess() {
        //获取服务大管家,通过ProcessEngines来获取管家的话,只要resources下有activiti.cfg.xml同名的配置文件,就会自动加载并建库
        ProcessEngine defaultProcessEngine = getProcessEngine();
        //获取相关服务(仓库服务)
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        //获取部署对象
        DeploymentBuilder deployment = repositoryService.createDeployment();
        //流程图取名并添加到对象
        deployment.name("请假流程").addClasspathResource("QingJia.bpmn").addClasspathResource("QingJia.png").deploy();
        //部署
        Deployment deploy = deployment.deploy();
        System.out.println("Id: " + deploy.getId());
        System.out.println("Name: " + deploy.getName());
        System.out.println("DeploymentTime: " + deploy.getDeploymentTime());
    }

就可以在数据库中看到数据了
在这里插入图片描述

5.启动第一个流程

通过key启动,key就是画流程图时给图取名的词,咱们用的Hello

    //启动流程
    @Test
    public void getStart() {
        //获取服务大管家
        ProcessEngine defaultProcessEngine = getProcessEngine();
        //获取相关服务(运行时服务)
        RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
        String key = "Hello";
        //启动流程实例
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(key);
        System.out.println("流程name为: " + processInstance.getName());
        System.out.println("流程实例ID为; " + processInstance.getId());
    }

6.查询私有任务

流程就启动起来了,现在走到我们开始定义的请假申请节点
执行人是柒柒,咱们来查询一下柒柒的私有任务,看看有没有

  //查询任务-私有任务
    @Test
    public void viewPersonTask() {
        ProcessEngine defaultProcessEngine = getProcessEngine();
        TaskService taskService = defaultProcessEngine.getTaskService();
        //创建查询对象
        TaskQuery taskQuery = taskService.createTaskQuery();
        //查询条件
        String assignee = "柒柒";
        taskQuery.taskAssignee(assignee);
        List<Task> list = taskQuery.list();
        System.out.println(list);
    }

在这里插入图片描述

7.执行任务

执行完毕之后,再去查询柒柒的私有任务,就已经没有了,流程已经走到了我们设定的审批节点,执行人为老夏,那么重复查询私有任务代码,名字改为老夏,就能看到了,然后将得到的任务id,再放到办理任务中去执行,老夏也就完成了任务,最后因为流程已经没有了任务节点,这个流程自动结束了

  //办理任务
    @Test
    public void completeProcess() {
        //获取管家
        ProcessEngine processEngine = getProcessEngine();
        //获取对应服务(任务服务)
        TaskService taskService = processEngine.getTaskService();
        String taskId = "2504";
        //办理任务
        taskService.complete(taskId);
    }

8. 查询流程部署列表

这里可以直接获取到部署过的所有的流程

//查询流程定义列表
    @Test
    public void getList() {
        ProcessEngine defaultProcessEngine = getProcessEngine();
        //获取相关服务(仓库服务)
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
        //获取查询对象
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //添加查询条件
        //...//

        List<ProcessDefinition> list = processDefinitionQuery.list();
        for (ProcessDefinition pd : list) {
            System.out.println("id-->" + pd.getId());
            System.out.println("name-->" + pd.getName());
            System.out.println("key-->" + pd.getKey());
            System.out.println("version-->" + pd.getVersion());
            System.out.println("resourceName-->" + pd.getResourceName());
            System.out.println("DeploymentId-->" + pd.getDeploymentId());
            System.out.println("DiagramResourceName-->" + pd.getDiagramResourceName());
            System.out.println("category-->" + pd.getCategory());
            System.out.println("Description-->" + pd.getDescription());
        }
    }

9. 获取流程定义的资源文件

这里可以将我们放在数据库的流程png图片,通过流输出到任意位置,就是说能够查看流程图片

//获取流程定义的资源文件
    @Test
    public void getView() throws IOException {
        //获取服务大管家,通过ProcessEngines来获取管家的话,只要resources下有activiti.cfg.xml同名的配置文件,就会自动加载并建库
        ProcessEngine processEngine = getProcessEngine();
        //获取相关服务(仓库服务)
        RepositoryService repositoryService = processEngine.getRepositoryService();
        String deploymentId = "15001";
        List<String> deploymentResourceNames = repositoryService.getDeploymentResourceNames(deploymentId);
        String resourceName = null;
        for (String deploymentResourceName : deploymentResourceNames) {
            if (deploymentResourceName.indexOf(".png") >= 0) {
                resourceName = deploymentResourceName;
            }
        }
        if (resourceName != null) {
            //指定目录
            File file = new File("C:\\Users\\xiashaoqi\\Desktop\\"+resourceName+".png");
            InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
            FileUtils.copyInputStreamToFile(resourceAsStream,file);
            System.out.println("文件保存路径为: "+file.toString());
        }
    }

10.删除流程部署

这里可以将我们部署的流程进行物理删除,无法恢复,被删除只能重新部署,最好是进行逻辑删除,类似于商品的上下架,就不贴上来了,各位看客可以开始自行尝试了

  //删除流程定义
    @Test
    public void delTest(){
        ProcessEngine processEngine = getProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        String id = "12501";
        repositoryService.deleteDeployment(id);
        System.out.println("删除流程成功");
    }
    private String getDateStr(Date date){
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return simpleDateFormat.format(date);
    }

总结

一个最最简单的单线流程就搞定了,总结一下,流程的部署,启动,删除,任务的查看,办理等等操作,都是由对应的服务来进行的,有什么需求,找到对应的服务调出对应的方法即可,这里只是个入门而已,后续还有超级多的东西等着我们,先去把25张表整明白,流程实例,流程变量…

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值