Activiti之程序实践

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lk142500/article/details/83240216

1 简介

Activiti是一个项目的名称,Alfresco软件在2010年5月17日宣布Activiti业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理BPM的专家 Tom Baeyens担任。该项目托管于GitHub。Activiti是一款良好的业务工作引擎。可以在日常生活办公中,以一种非常高效的速度开发OA等办公应用。工作流对应于日常办公等诸如请销假,物资管理,党费管理,等涉及多个任务节点的工作流程。工作流(Workflow)是对于工作流程及其各操作步骤之间业务规则的抽象、概括、描述、。工作流缄默,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以一种恰当的模型进行表示并对其实施计算。办公自动化,即使用工作流思想进行改善办公效率。

2 材料

MySQL数据库
JDK
集成了activiti插件的eclipse
activiti-6.0.0依赖
navicat 12

2.1 MySQL安装步骤

MySQL数据库的配置和安装参见

https://blog.csdn.net/lk142500/article/details/83049080

在这里插入图片描述
MySQL的版本信息如下:
在这里插入图片描述

2.2 navicat 12

参见

https://blog.csdn.net/lk142500/article/details/83239221

在这里插入图片描述

2.3 集成了Activiti6.0.0的eclipse

参见
在这里插入图片描述

2.4 JDK安装和配置

不再赘述

2.5 依赖

参见

https://download.csdn.net/download/lk142500/10734716

在新建的项目下,导入Ativiti-6.0.0步骤如下

2.5.1 建立lib目录

按照下图的方式在src同级目录下新建lib目录,属性为folder

2.5.2 解压拷贝粘贴

下载好依赖之后,解压到本地目录,进入该目录,通过Ctrl + A, Ctrl + c即可复制,登陆eclipse,右击lib目录,选择粘贴即可看到lib目录下已经包含了所有的jar包。

2.5.3 导入项目

右击项目first-act,选择Build Path,进入如下界面,通过店家Add JARs,添加本地依赖。
在这里插入图片描述

3 程序结构

在这里插入图片描述
注意:建立一个普通的java项目即可,命名随意。另外需要建立两个Source Folder和一个Folder,如上图标识。

3.1 各部分内容

3.1.1 流程控制配置文件

3.1.1.1 activiti.cfg.xml

启动Activiti流程引擎时,需要配置一系列的参数,高速Activiti以何种方式进行工作,这些可以配置的参数包括,数据库配置、事务配置和Activiti内置的服务配置等。
ProcessEngineConfiguration对象代表一个Activiti流程引擎的全部配置,该类提供一系列创建ProcessEngineConfiguration实例的静态方法。创建该配置对象的默认方法是由Activiti读取配置文件,由Activiti指定读取配置文件的位置、文件的名称、和配置bean的名称这些信息,默认情况下,Activiti读取ClassPath下名为activiti.cfg.xml的配置文件,启动并获取名称为”processEngineConfiguration”的bean实例。解析XML文件并创建该实例的过程由Spring代为完成
笔者使用的该文件内容如下:

<?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 -->
	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/ACT" />
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUsername" value="root" />
		<property name="jdbcPassword" value="123456" />
		<property name="databaseSchemaUpdate" value="true" />
	</bean>
</beans>

上述文件的内容主要包括数据库配置。因此在使用该配置文件时,首先要在数据库中创建名为ACT的数据库。并且设置相应的用户名和密码。
名为”databaseSchemaUpdate”在设置为true后,Activiti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。

3.1.1.2 log4j.properties

log4j.properties则负责在流程启动的过程中为我们打印日志信息。
内容如下:

log4j.rootLogger=INFO, stdout

# Console Appender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n
# Custom tweaks
log4j.logger.com.codahale.metrics=WARN
log4j.logger.com.ryantenney=WARN
log4j.logger.com.zaxxer=WARN
log4j.logger.org.apache=WARN
log4j.logger.org.hibernate=WARN
log4j.logger.org.hibernate.engine.internal=WARN
log4j.logger.org.hibernate.validator=WARN
log4j.logger.org.springframework=WARN
log4j.logger.org.springframework.web=WARN
log4j.logger.org.springframework.security=WARN

3.1.2 bpmn文件

bpmn文件是用XML语言描述业务流程的文件,Activiti的流程文件需要遵守BPMN2.0规范。使用Activiti的Eclipse插件新建一个图示的含有流程元素流程文件,会自动生成与之相对应的流程描述文件。

3.1.2.1 简单的请假流程图示

在这里插入图片描述

3.1.2.2 XML流程描述文件

<?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="My process" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <endEvent id="endevent1" name="End"></endEvent>
    <userTask id="usertask1" name="Write Vacation"></userTask>
    <userTask id="usertask2" name="Audit"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></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="160.0" y="140.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="560.0" y="140.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="250.0" y="130.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="410.0" y="130.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="195.0" y="157.0"></omgdi:waypoint>
        <omgdi:waypoint x="250.0" y="157.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="355.0" y="157.0"></omgdi:waypoint>
        <omgdi:waypoint x="410.0" y="157.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="515.0" y="157.0"></omgdi:waypoint>
        <omgdi:waypoint x="560.0" y="157.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

上述的代码片段为一个流程文件,该文件中的process元素用于描述流程信息,而bpmndi:BPMNDiagram元素则用于描述这些流程节点中的位置信息。

3.1.3 First.java

该文件为通过java代码使用activiti6.0提供的jar包中API操作依赖的源代码。内容如下:

package org.crazit.act.c3;


import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;

public class First {
	public static void main(String[] args) {
		
		//创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		//得到流程存储服务组件
		RepositoryService repositoryService = engine.getRepositoryService();
		//获取流程任务组件
		TaskService taskService = engine.getTaskService();
		//获取流程运行时服务组件
		RuntimeService runtimeService = engine.getRuntimeService();
		//部署流程文件
		repositoryService.createDeployment().addClasspathResource("first.bpmn").deploy();
		//启动流程
		runtimeService.startProcessInstanceByKey("myProcess");
		
		Task task =  taskService.createTaskQuery().singleResult();
		System.out.println("第一个任务完成前,当前任务名称: "+task.getName());
		taskService.complete(task.getId());
		//完成第一个任务
		task = taskService.createTaskQuery().singleResult();
		System.out.println("第二个任务完成前,当前任务名称: "+task.getName());
		taskService.complete(task.getId());
		
		task = taskService.createTaskQuery().singleResult();
		System.out.println("流程结束后,查找任务: "+ task);
		//退出
		System.exit(0);
		}
}

在有了流程引擎的配置文件和 流程文件之后,就可以编写代码启动流程引擎,并加载该流程文件。

3.1.4 开发Activiti过程

一般在进行activiti开发的过程中,包含如下四个过程
在这里插入图片描述

3.1.5 运行结果

11:11:46,205 [main] INFO  org.activiti.engine.ProcessEngines  - Initializing process engine using configuration 'file:/C:/Users/%e5%85%a8%e6%81%92/eclipse-workspace/first-act/bin/activiti.cfg.xml'
11:11:46,206 [main] INFO  org.activiti.engine.ProcessEngines  - initializing process engine for resource file:/C:/Users/%e5%85%a8%e6%81%92/eclipse-workspace/first-act/bin/activiti.cfg.xml
11:11:46,681 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - Found 1 auto-discoverable Process Engine Configurators
11:11:46,682 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - Found 1 Process Engine Configurators in total:
11:11:46,682 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - class org.activiti.management.jmx.JMXConfigurator (priority:10000)
11:11:46,682 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - Executing beforeInit() of class org.activiti.management.jmx.JMXConfigurator (priority:10000)
Sun Oct 21 11:11:46 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
11:11:48,425 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - Found compatibility handler instance : class org.activiti.compatibility.DefaultActiviti5CompatibilityHandler
11:11:48,425 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - Executing configure() of class org.activiti.management.jmx.JMXConfigurator (priority:10000)
11:11:48,530 [jmxConnectorStarterThread] INFO  org.activiti.management.jmx.DefaultManagementAgent  - JMX Connector thread started and listening at: service:jmx:rmi:///jndi/rmi://Lenovo-PC:1099/jmxrmi/activiti
11:11:48,590 [main] INFO  org.activiti.engine.impl.ProcessEngineImpl  - ProcessEngine default created
11:11:48,596 [main] INFO  org.activiti.engine.ProcessEngines  - initialised process engine default
第一个任务完成前,当前任务名称: Write Vacation
第二个任务完成前,当前任务名称: Audit
流程结束后,查找任务: null

4 总结

之前一直想要写一下Activiti的文章,但由于周末放纵总是没有写,抽这个周日,把完整的第一个Activiti程序完整过程给记录下来,即希望能够帮助想要进行activiti学习的菜鸟,也算是一条记录。

5 参考

杨恩雄老师疯狂工作流讲义和视频教程

猜你喜欢

转载自blog.csdn.net/lk142500/article/details/83240216