activiti7入门体验(2)

activiti7入门体验(2)

在大家学习了activiti7基本学习过后想必都对activiti7有一定的理解了,接下来我就给大伙讲述一下activiti7基本的功能和环境的搭建

开发环境

java环境

jdk1.8

数据库环境

mysql5.5或以上都可以哦!

开发工具

Mysql客户端连接工具,Sqlyog 或其它
文本编辑器EditPlus或其它
Java开发工具: IDEA或Eclipse工具
注意: activiti 的流程定义工具插件可以安装在IDEA下,也可以安装在Eclipse工具下。

Activiti环境

Activiti7.0.0.Betal
默认支持spring5

下载activiti7

Activiti下载地址: htp://activiti org/download.html

`<dependencyManagement>
	<dependencies>
		< dependency>
		<group Id>org. act iviti </groupId>
		<artif actId>activiti -dependencies</ arti f actId>
		<version>7. 0.0.Beta1< /vers ion>
		< scope> import</s cope>
		<type>pom</ type>
		< /dependency>
	< /dependencies>
</ dependencyManagement>`
1) Database :

activiti运行需要有数据库的支持,支持的数据库有: h2, mysq1, oracle, postgres, mssql, db2
等,该目录存放activiti的建表脚本。

2) Docs

Activiti的帮助文档。

3) Wars

官方自带的示例工程。

Activiti Designer流程设计器Eclispe工具下插件安装方式(Eclipse工具)

打开Help -> Install New Software.在如下面板中:
在这里插入图片描述
2)在如下Install界面板中,点击Add按钮:
在这里插入图片描述
配置新装插件的地址和名称
3)然后填入下 列字段
Name: Activiti BPMN 2.0 designer
Location: http://activit.org/designer/ update/
在这里插入图片描述
4)回到Install界面,在面板正中列表中把所有展示出来的项目都勾.上:

在这里插入图片描述
5)点击复选框
在Detail部分记得选中"Contact all updates sites…" ,因为沱会检查所有当前安装所需
要的插件并可以被Eclipse’下载.
6)安装完以后, 点击新建工程new->0ther…打开面板,如果看到下图内容:说明就安装成功了
在这里插入图片描述

补充说明

打开菜单Windows->P references-> Activiti-> Save’下流程图片的生成方式:
在这里插入图片描述
虽然流程引擎在单独部署bpmn文件时会自动生成图片,但在实际开发过程中,自动生成的图
片会导致和BPMN中的坐标有出入,在实际项目中展示流程当前位置图会有问题。所在完成以上配置后,会由我们自己来管理流程图片。在发布流程时把流程规则文件和流程图片- -起上传就行了。

Activiti Designer流程设计器(idea安装方式)

在IDEA的File菜单中找到子菜单"ettings",后面我们再选择左侧的“plugins”菜单,如下图所示:
在这里插入图片描述
此时我们就可以搜索到actiBPM插件,它就是Activiti Designer的IDEA版本。.
安装好后,页面如下:
在这里插入图片描述

创建mysql数据库

我使用的是mysql数据库。
创建mysql数据库activiti (名字任意):

  1. CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;

创建表方式

通过运行java程序创建表。

创建java工程

使用eclipse 或idea创建maven的java工程。

加入maven依赖的坐标(jar 包)

首先需要在java工程中加入ProcessEngine所需要的jar 包,包括:
1)activiti-engine- 7.0.0.betal jar
2) activiti 依赖的jar包: mybatis、 alf4j、 log4j 等
3) activiti 依赖的spring包
4)数据库驱动
5)第三方数据连接池dbq
6)单 元测试Junit-4.12jar
我们使用maven来实现项目的构建,所以应当导入这些jar所对应的坐标到pom.xml文件中。

 <properties>
        <slf4j.version>1.6.6</slf4j.version>
        <log4j.version>1.2.12</log4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-model</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-converter</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>org.activiti.cloud</groupId>
            <artifactId>activiti-cloud-services-api</artifactId>
            <version>7.0.0.Beta1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!-- log start -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log end -->

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>

        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

    </dependencies>
log4j.properties
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE

# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n


log4j.properties
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/contex http://www.springframework.org/schema/context/spring-context.xsd
						http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/itcast0711activiti" />
        <property name="username" value="root" />
        <property name="password" value="root" />
        <property name="maxActive" value="3" />
        <property name="maxIdle" value="1" />
    </bean>

    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="dataSource" ref="dataSource"></property>
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>

    <!--<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/itcast0711activiti"/>
        <property name="jdbcUsername" value="root"/>
        <property name="jdbcPassword" value="root"/>
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>-->
</beans>

关于processEngineConfiguration中的da tabaseSchemaUpdate参数,通过此参数设计activiti数据表的处理策略,参数如下:
false (默认):检查数据库表的版本和依赖库的版本,如果版 本不匹配就抛出异常。
true:构建流程引擎时,执行检查,如果需要就执行更新。如果表不存在, 就创建。
create-drop:构建流程引擎时创建数据库表,关闭流程 引擎时删除这些表。
drop-create:先删除表再创建表。
create:构建流程引擎时创建数据库表,关闭流程 引擎时不删除这些表。

编写程序

创建ProcessEngineConfiguration,通过ProcessEngineConfiguration创建ProcessEngine,在创建ProcessEngine时会自动创建数据库。

//创建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource ("activiti. cfg. xml")
// 通过ProcessEngineConfigurat ion创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine =configuration.buildProcessEngine();
System.out .println( processEngine);

说明:
1、运行以上程序段即可完成activiti数据库创建,通过改变activiti.cfg. xml中databaseSchemaUpdate参数的值执行不同的数据表处理策略。
2、上边的方法createProcessEngineConfigurationFromResource 在执行时在activiti. cfg. xmL中找固定的名称processEngineConfiguration也可以使用重载方法调用,这时可以不用限定processEngineConfiguration名称

  1. createProcessEngi neConfi gur ati onFr omResource CString resource, String beanName)

此时我们查看数据库,创建了25 张表,结果如下:
在这里插入图片描述

流程定义

Palette (画板)

在eclipse或idea中安装activiti-designer插件即可使用,画板中包括以下结点:
Connection-连接
Event–事件
Task–任务
Gateway–网关
Container-容器
Boundaryevent-边界事件
Intermediate event- -中间事件
流程图设计完毕保存生成.bpmn文件。

新建流程(IDEA工具)

首先选中存放图形的目录(本次我们选择resources 下的bpmn目录),点击菜单: New-BpmnFile,
在这里插入图片描述
在这里插入图片描述
起完名字holiday后(默认扩展名为bpmn),就可以看到进入了流程设计页面,如图所示:

新建流程(eclipse工具)

首先选中存放图形的目录(本次我们选择resources’ 下的bpmn目录),
File-New-Other 菜单,打开如下窗口。
在这里插入图片描述
左侧区域是绘图区,右侧区域是palette画板区域鼠标先点击画板的元素即可在左侧绘图。

在这里插入图片描述

流程绘制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

指定流程的key

流程定义key即流程定义的标识,在eclipse中通过properties视图查看流程的key ,
建议:相同的业务流程,流程定义的key名字定义一一样,比如,如果需要创建新的业务流程,请假流程则使用新的key.
在这里插入图片描述

指定任务负责人

在properties视图指定每个任务结点的负责人,比如下边是填写请假单的负责人为zhangsan
在这里插入图片描述

流程部署定义

部署流程定义就是要将上边绘制的图形即流程定义( .bpmn)部署在工作流程引擎activiti 中,方法
如下:使用ProcessEngine创建RepositoryService,代码如下:

//获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//部署对象
Deployment deployment = repositoryService . createDeployment()
.addClasspathResource( "diagram/myholiday . bpmn")// bpmn 文件
.addClasspathResource("diagram/myholiday. png")// 图片文件
.name("请假申请流程"). deploy();
System. out . println( "流程部署id:" + deployment . getId());
System . out. println( "流程部署名称:" + deployment . getName());

执行此操作后activiti 会将.上边代码中指定的bpm文件和图片文件保存在activiti数据库。

启动一个流程实例

流程定义部署在activiti后就可以通过工作流管理业务流程了,也就是说上边部署的请假申请流程可以使用了。
针对该流程,启动一个流程表示发起–个新的请假申请单,这就相当于java类与java对象的关
系,类定义好后需要new创建- - 个对象使用,当然可以new多个对象。对于请假申请流程,张三发
起一个请假申请单需要启动-个流程实例,请假申请单发起–个请假单也需要启动-一个流程实例。
代码加下。

//启动一个流程实例
@Test 
public void startProcessInstance() {
//获取RunTimeService
=
RuntimeService runtimeServiceprocessEngine.getRuntimeService();
//根据流程定义key启动流程
ProcessInstance processInstance = runtimeService
. startProcessInstanceByKey( "myholiday");
System. out . print1n("流程定义id+processInstance . getProcessDefinitionId());
System. out . println( "流程实例id: " + processInstance. getId());
System. out . println("当前活动Id+processInstance. getActivityId());

任务查询

  //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //3.根据流程定义的key,负责人assignee来实现当前用户的任务列表查询
        List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionKey("myholiday")
                .taskAssignee("zhangsan")
                .list();

        //4.任务列表的展示
        for(Task task :taskList){
            System.out.println("流程实例ID:"+task.getProcessInstanceId());
            System.out.println("任务ID:"+task.getId());
            System.out.println("任务负责人:"+task.getAssignee());
            System.out.println("任务名称:"+task.getName());
        }

任务处理

任务负责人查询待办任务,选择任务进行处理,完成任务。

 //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //3.查询当前用户的任务
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myholiday")
                .taskAssignee("zhangsan")
                .singleResult();

        //4.处理任务,结合当前用户任务列表的查询操作的话,任务ID:task.getId()
        taskService.complete(task.getId());

        //5.输出任务的id
        System.out.println(task.getId());

流程定义查询

 //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.创建RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //3.得到ProcessDefinitionQuery对象,可以认为它就是一个查询器
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();

        //4.设置条件,并查询出当前的所有流程定义   查询条件:流程定义的key=holiday
        //orderByProcessDefinitionVersion() 设置排序方式,根据流程定义的版本号进行排序
        List<ProcessDefinition> list = processDefinitionQuery.processDefinitionKey("holiday")
                .orderByProcessDefinitionVersion()
                .desc().list();

        //5.输出流程定义信息
        for(ProcessDefinition processDefinition :list){
            System.out.println("流程定义ID:"+processDefinition.getId());
            System.out.println("流程定义名称:"+processDefinition.getName());
            System.out.println("流程定义的Key:"+processDefinition.getKey());
            System.out.println("流程定义的版本号:"+processDefinition.getVersion());
            System.out.println("流程部署的ID:"+processDefinition.getDeploymentId());

        }

流程定义删除

删除已经部署成功的流程定义。

//1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.创建RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //3.执行删除流程定义  参数代表流程部署的id
        repositoryService.deleteDeployment("1");

说明:

  1. 使用repositoryService删除流程定义
    2)如果该流程定义下没有正在运行的流程,则可以用普通删除。
    3)如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关
    记录全部删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使
    用。

流程定义资源查询

通过流程定义对象获取流程定义资源,获取bpmn和png。

//1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RepositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //3.得到查询器:ProcessDefinitionQuery对象
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();

        //4.设置查询条件
        processDefinitionQuery.processDefinitionKey("holiday");//参数是流程定义的key

        //5.执行查询操作,查询出想要的流程定义
        ProcessDefinition processDefinition = processDefinitionQuery.singleResult();

        //6.通过流程定义信息,得到部署ID
        String deploymentId = processDefinition.getDeploymentId();

        //7.通过repositoryService的方法,实现读取图片信息及bpmn文件信息(输入流)
        //getResourceAsStream()方法的参数说明:第一个参数部署id,第二个参数代表资源名称
        //processDefinition.getDiagramResourceName() 代表获取png图片资源的名称
        //processDefinition.getResourceName()代表获取bpmn文件的名称
        InputStream pngIs = repositoryService
                .getResourceAsStream(deploymentId,processDefinition.getDiagramResourceName());
        InputStream bpmnIs = repositoryService
                .getResourceAsStream(deploymentId,processDefinition.getResourceName());

        //8.构建出OutputStream流
        OutputStream pngOs =
                new FileOutputStream("G:\\Activiti7开发计划\\Activiti7-day03\\资料\\"+processDefinition.getDiagramResourceName());

        OutputStream bpmnOs =
                new FileOutputStream("G:\\Activiti7开发计划\\Activiti7-day03\\资料\\"+processDefinition.getResourceName());

        //9.输入流,输出流的转换  commons-io-xx.jar中的方法
        IOUtils.copy(pngIs,pngOs);
        IOUtils.copy(bpmnIs,bpmnOs);
        //10.关闭流
        pngOs.close();
        bpmnOs.close();
        pngIs.close();
        bpmnIs.close();

流程定义资源查询

即使流程定义已经删除了,流程执行的历史信息通过前面的分析,依然保存在activiti 的act hi_ *相
关的表中。所以我们还是可以查询流程执行的历史信息,可以通过HistoryService 来查看相关的历史
记录。

 //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到HistoryService
        HistoryService historyService = processEngine.getHistoryService();

        //3.得到HistoricActivitiInstanceQuery对象
        HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();

        historicActivityInstanceQuery.processInstanceId("2501");//设置流程实例的id

        //4.执行查询
        List<HistoricActivityInstance> list = historicActivityInstanceQuery
                .orderByHistoricActivityInstanceStartTime().asc().list();//排序StartTime

        //5.遍历查询结果
        for (HistoricActivityInstance instance :list){
            System.out.println(instance.getActivityId());
            System.out.println(instance.getActivityName());
            System.out.println(instance.getProcessDefinitionId());
            System.out.println(instance.getProcessInstanceId());
            System.out.println("=============================");
        }

本文参考了黑马程序员网站的资料www.itheima.com 感谢此网站让我学到了很多知识

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值