Activiti6.0基于SpringMVC和JPA的整合案例分析

1、Acitviti6.0

如果用到springboot整合activiti的jar包,前端如果是jstl的话,要在activiti-spring-boot-basic的依赖下excultion掉juel-spi的包。
Activiti6.0在5.2版本的基础上将表的细致性更新了,同时表的数量上多了近一倍。而且也没有了5.2版本的activiti-explorer的官方demo,取而代之的是activiti-app,这个demo的使用方法与activiti-explorer的使用方法类似。
将activiti6.0的官方demo下载下来之后解压为activiti-6.0.0,打开目录,进入database,进入create,找到自己所用的数据库类型,然后导入数据库即可。
表的分类:

数据表分类描述
ACT_GE_*通用数据表
ACT_RE_*流程定义储存表
ACT_ID_*身份信息表
ACT_RU_*运行时数据库表
ACT_HI_*历史数据库表

主要用到的表的内容如下(详细表结构与对应实体类):

表名功能作用
act_ge_property属性表(自带)
act_ge_bytearray资源表(储存流程定义相关的资源)
act_re_deployment流程部署记录表
act_re_procdef流程定义信息表
act_re_model模型信息表
act_procdef_info流程定义动态改变信息表
act_id_user用户的基本信息
act_id_info用户的拓展信息
act_id_group群组
act_id_membership用户与群组的关系
act_ru_deadletter_job死信表
act_ru_event_subscr事件监听表
act_ru_execution流程实例与分支执行信息
act_ru_identitylink参与者相关信息
act_ru_job作业表
act_ru_suspended_job暂停作业表
act_ru_task用户任务信息
act_ru_timer_job定时器表
act_ru_variable变量信息
act_hi_actinst历史节点信息表
act_hi_attachment附件
act_hi_comment评论
act_hi_detail历史变更
act_hi_identitylink历史参与者
act_hi_procinst历史流程实例表
act_hi_taskinst历史任务表
act_hi_varinst历史变量
act_evt_log事件日志

2、一个完整的Activiti流程(通过h2数据库进行模拟)

pom文件:

<dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>6.0.0</version>
        </dependency>

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

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.11</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>23.0</version>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.199</version>
        </dependency>

流程图
流程图
流程图的内容:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="myProcess" name="审批流程" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="submit_form" name="填写审批信息">
      <extensionElements>
        <activiti:formProperty id="message" name="申请信息" type="string" required="true"></activiti:formProperty>
        <activiti:formProperty id="name" name="申请人名称" type="string" required="true"></activiti:formProperty>
        <activiti:formProperty id="subDate" name="提交时间" type="date" datePattern="yyyy-mm-dd" required="true"></activiti:formProperty>
        <activiti:formProperty id="subType" name="确认申请" type="string" required="true"></activiti:formProperty>
      </extensionElements>
    </userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="submit_form"></sequenceFlow>
    <exclusiveGateway id="exclusivegateway1" name="提交or取消"></exclusiveGateway>
    <sequenceFlow id="flow2" sourceRef="submit_form" targetRef="exclusivegateway1"></sequenceFlow>
    <userTask id="pr_form" name="主管审批">
      <extensionElements>
        <activiti:formProperty id="PrType" name="主管审批结果" type="string"></activiti:formProperty>
        <activiti:formProperty id="PrResult" name="主管备注" type="string" required="true"></activiti:formProperty>
      </extensionElements>
    </userTask>
    <sequenceFlow id="flow3" sourceRef="exclusivegateway1" targetRef="pr_form">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${subType == "y" || subType == "Y"}]]></conditionExpression>
    </sequenceFlow>
    <exclusiveGateway id="decide_pr" name="主管审批校验"></exclusiveGateway>
    <sequenceFlow id="flow4" sourceRef="pr_form" targetRef="decide_pr"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <endEvent id="endevent2" name="取消"></endEvent>
    <sequenceFlow id="flow8" sourceRef="exclusivegateway1" targetRef="endevent2">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${subType == "n" || subType == "N"}]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="flow9" sourceRef="decide_pr" targetRef="submit_form">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${PrType == "N" || PrType == "n" }]]></conditionExpression>
    </sequenceFlow>
    <sequenceFlow id="flow10" sourceRef="decide_pr" targetRef="endevent1">
      <conditionExpression xsi:type="tFormalExpression"><![CDATA[${PrType == "Y" || PrType == "y" }]]></conditionExpression>
    </sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
    <bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="131.0" y="201.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="submit_form" id="BPMNShape_submit_form">
        <omgdc:Bounds height="55.0" width="105.0" x="211.0" y="191.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1">
        <omgdc:Bounds height="40.0" width="40.0" x="360.0" y="198.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="pr_form" id="BPMNShape_pr_form">
        <omgdc:Bounds height="55.0" width="105.0" x="445.0" y="191.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="decide_pr" id="BPMNShape_decide_pr">
        <omgdc:Bounds height="40.0" width="40.0" x="595.0" y="199.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="720.0" y="202.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent2" id="BPMNShape_endevent2">
        <omgdc:Bounds height="35.0" width="35.0" x="445.0" y="320.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="166.0" y="218.0"></omgdi:waypoint>
        <omgdi:waypoint x="211.0" y="218.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="316.0" y="218.0"></omgdi:waypoint>
        <omgdi:waypoint x="360.0" y="218.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="400.0" y="218.0"></omgdi:waypoint>
        <omgdi:waypoint x="445.0" y="218.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
        <omgdi:waypoint x="550.0" y="218.0"></omgdi:waypoint>
        <omgdi:waypoint x="595.0" y="219.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow8" id="BPMNEdge_flow8">
        <omgdi:waypoint x="380.0" y="238.0"></omgdi:waypoint>
        <omgdi:waypoint x="379.0" y="337.0"></omgdi:waypoint>
        <omgdi:waypoint x="445.0" y="337.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow9" id="BPMNEdge_flow9">
        <omgdi:waypoint x="615.0" y="199.0"></omgdi:waypoint>
        <omgdi:waypoint x="614.0" y="74.0"></omgdi:waypoint>
        <omgdi:waypoint x="263.0" y="74.0"></omgdi:waypoint>
        <omgdi:waypoint x="263.0" y="191.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow10" id="BPMNEdge_flow10">
        <omgdi:waypoint x="635.0" y="219.0"></omgdi:waypoint>
        <omgdi:waypoint x="720.0" y="219.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

注意情况

  • 在eclipse中进行绘制图表,idea绘制插件2014年停止更新,很落后
  • 网关流转后的输出条上在这里插入图片描述点击,进入main config,在condition中添加 ${PrType == “Y” || PrType == “y” },其中PrType是在前面在这里插入图片描述主管审批节点的form表单中的一个string数据;
  • 在填写表单的时候要记住数据类型要小写;
  • h2数据库登录哪个用户即为哪个库
  • ProcessEngineConfigure有默认配置,默认的h2数据库名称为activiti,账户为sa,密码为空,在这里插入图片描述
    登录之后导入activiti所需的数据表;
  • 部署流程之后获取不到定义,后缀应为*.bpmn20.xml。
  • 在eclipse中打开bpmn点击流程图框不显示配置,依次点击window -> perspective -> open perspective -> activiti,即可。

1、创建引擎:

/** 这里代码自动填补返回值  alt + ctrl+v  自动重构代码 alt + shift +M */
/** 获取引擎配置文件,这里查询的是 ACT_GE_PROPERTY  */
ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();

/** 通过配置文件创建引擎 */ 
PeocessEngine processEngine = cfg.buildProcessEngine;

String name = processEngine.getName();
String version = processEngine.VERSION;
/**  可以将name  version 输出 */

2、部署流程定义文件

/** 部署流程定义文件 */
/** 获取仓库service 往ACT-RE数据库加载数据 */
ReositoryService repositoryService = processEngine.getRepositoryService();

/** 通过仓库服务获取对ACT-DE系列数据表操作的权限 */
DeploymentBuilder deployment = repositoryService.createDeloyment();

/** 加载文件通过获取绝对目录 */
deployment.addClasspathResource("yourPath");

/** 通过该方法将其部署,加载至数据库(两个表一个ACT_GE_BYTEARRAY ,一个SELECT * FROM ACT_RE_DEPLOYMENT )
Deployment deploy = deployment.deploy();

/** 获取部署的id */
String id = deploy.getId();

/** 通过id获取流程实例 */
ProcessDefinition processDefinition = repositoryService.createProcessDefinition.deloymentId(id).singleResult();

/** 可是将流程实例的信息输出查看 */

3、处理流程任务

Scanner sc = new Scanner(System.in);
/** 当流程定义不为空且流程实例没有完成时 */
while (processDefinition != null && !processInstance.isEnd) {

	/** 通过引擎获取任务服务 */
	TaskService taskService = processEngine.getTaskService();

	/** 通过任务服务获取全部待处理任务 */
	List<Task> list = taskService.createTaskQuery().list();
	/** 可以在这输出一下待处理的任务数 list.size() */

	list.forEach(task -> {
		/** 待处理任务 task.getName() */
		
		/** 获取表单服务 */
		FormService form = processEngine.getFormService();
		
		/** 通过表单服务根据任务id获取任务表单的具体数据类型 */
		TaskFormData taskFormData = form.getTaskFormData(task.geId);

		/** 获取表单的key-value , key 标题, value */
		List<FormPropertty> formProperties = taskFormData.getFormProperties();
		
		/* 用来存放表单标题和输出内容的集合 */
		Map<String, Object> map = Maps.newHashMap();
		
		formProperties.forEach(p -> {
			String line = null;
			/** 判断当前标题所填值得属性进行分类型输入 */
			if (StringFormType.class.isInstance(p.getType())) {
					line = sc.nextLine();
					map.put(p.getId(), line);
				} else if (DateFormType.class.isInstance(p.getType())) {
					line = sc.nextLine();
					SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd");
					Date date = sm.parse(line); //这里对其进行捕获处理
					map.put(p.getId, line);
				} else {
				 	/** 不支持的类型 */
				}
				/** 可以输出输入的内容 line */
		});
			/* 通过任务服务来完成当前节点的任务 */
			taskService.complete(task.getId(), map);
			/** 再获取下一个节点的任务 直至不符合循环 */
			processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
	});
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 初识Activiti 1.1. 工作流与工作流引擎 工作流(workflow)就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。(我的理解就是:将部分或者全部的工作流程、逻辑让计算机帮你来处理,实现自动化) 所谓工作流引擎是指workflow作为应用系统的一部分,并为之提供对各应用系统有决定作用的根据角色、分工和条件的不同决定信息传递路由、内容等级等核心解决方案。 例如开发一个系统最关键的部分不是系统的界面,也不是和数据库之间的信息交换,而是如何根据业务逻辑开发出符合实际需要的程序逻辑并确保其稳定性、易维护性和弹性。 比如你的系统中有一个任务流程,一般情况下这个任务的代码逻辑、流程你都要自己来编写。实现它是没有问题的。但是谁能保证逻辑编写的毫无纰漏?经过无数次的测试与改进,这个流程没有任何漏洞也是可以实现的,但是明显就会拖慢整个项目的进度。 工作流引擎解决的就是这个问题:如果应用程序缺乏强大的逻辑层,势必变得容易出错(信息的路由错误、死循环等等)。 1.2. BPMN2.0规范 BPMN(Business Process Model and Notation)--业务流程模型与符号。 BPMN是一套流程建模的标准,主要目标是被所有业务用户容易理解的符号,支持从创建流程轮廓的业务分析到这些流程的最终实现,知道最终用户的管理监控。 通俗一点其实就是一套规范,画流程模型的规范。流程模型包括:流程图、协作图、编排图、会话图。详细信息请google。 1.3. Activiti概述 1.3.1. Activiti由来 学习过Activiti的朋友都知道,Activiti的创始人也就是JBPM(也是一个优秀的BPM引擎)的创始人,从Jboss离职后开发了一个新的BPM引擎:Activiti。所以,Activiti有很多地方都有JBPM的影子。所以,据说学习过JBPM的朋友学起Activiti来非常顺手。 由于本人之前没有工作流及JBPM的相关基础,刚开始学习Activiti的时候可以说是无比痛苦的,根本不知道从何下手,这里也建议大家先进行工作流及BPMN2.0规范的学习,有了一定的基础后,再着手学习Activiti。 1.3.2. Activiti简介 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超稳定的 BPMN2.0 流程引擎,强调流程服务的可嵌入性和可扩展性,同时更加强调面向业务人员。 Activiti 流程引擎重点关注在系统开发的易用性和轻量性上。每一项 BPM 业务功能 Activiti 流程引擎都以服务的形式提供给开发人员。通过使用这些服务,开发人员能够构建出功能丰富、轻便且高效的 BPM 应用程序。 1.4. 文档说明 以上部分对工作流、BPMN、Activiti的概念做了一个简单的介绍,目的是了解Activiti究竟是什么,能做些什么…及在学习Activiti之前需要了解的知识与技术。其中大部分文字来自Copy网上的各种资料与文档,通过总结而来的。具体的更详细的内容需自己google,参考一些官方的文档与手册。 本文档之后内容如下: 1) 下载与使用 2) 核心组件与说明 3) 入门示例 4) Eclipse中的Activiti插件的使用 本文档旨在为初学Activiti的朋友提供入门级别的参考,不会对其原理及其结构进行深层次的探究(更多是因为目前自身理解还不是很透彻),只是为大家理清思路,方便以后更深层次的学习。本文档还有一个重要的特点,那就是根据自己看官方手册的经验,教大家如何看手册从而更有效率!由于是初学,很多术语或解释难免理解有偏差,所以一定要看官方提供的文档与手册,那才是学习的最佳途径! 2. 开始学习 2.1. 必要的准备 2.1.1. 下载与了解目录 下载Activiti:下载路径,也就是官方网站的地址:http://activiti.org/download.html。下载后解压(我所使用的是5.12版本的,Activiti更新速度飞快,几乎每两个月就会有一个更新的小版本),看到如下目录: 1) database:里面存放的是Activiti使用到的数据库信息的sql文件,它支持的数据库类型如下图,使用时只需执行你自己的数据库类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值