工作流
主要讲Activiti (官网)
Activiti是一个项目的名称,Alfresco软件在2010年5月17日宣布Activiti业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理BPM的专家 Tom Baeyens担任。
Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。
创始人Tom Baeyens是JBoss jBPM的项目架构师,以及另一位架构师Joram Barrez,一起加入到创建Alfresco这项首次实现Apache开源许可的BPMN 2.0引擎开发中来。
其实简单的来说工作流就是将需要完成某个流程的各个任务组合起来,实现自动化的去完成这些任务,优点就是它实现了工作流程的自动化并且大大提高企业的运作效率;
实现过程
**pom.xml文件**
<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>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
</dependencies>
第二步:
需要在resources文件下创建 右击
会出现下面这样的界面:(使用idea 下的activiti插件画图—自行百度)
这里可能生成会出现乱码情况:
点击这个链接去查看解决:https://blog.youkuaiyun.com/jiankunking/article/details/73188603添加链接描述
简单的介绍下里面的变量:
Name是这个任务的名称。
Assignee是执行这个任务的人,此处的意思就是项目经理要请假,其实项目经理这个地方是个变量,设置成为变量的意思就是任何人都可以,而不是只是在这儿设置的项目经理了,当然为了方便理解我们就这样做了。
我们也可以将创建的这个文件leave.bpmn赋值一份 然后将其后缀给为xml
然后我们可以看到配置信息:
除了头文件以及小编下面截取出来的,其余的都是坐标信息:
首先是流程节点:
<process id="myProcess_1" isClosed="false" isExecutable="true" processType="None">
开始节点
<startEvent id="_2" name="StartEvent"/>
结束节点
<endEvent id="_3" name="EndEvent"/>
第一个请假节点且表面请假的人是项目经理
<userTask activiti:assignee="项目经理" activiti:exclusive="true" id="_4" name="请假"/>
第二个审批节点批准的认时总监
<userTask activiti:assignee="总监" activiti:exclusive="true" id="_5" name="审批"/>
下面三个就是之前画的流程图中的三条线:
2是开始 3是结束 4是请假
5审批
<sequenceFlow id="_6" sourceRef="_2" targetRef="_4"/>
<sequenceFlow id="_7" sourceRef="_4" targetRef="_5"/>
<sequenceFlow id="_8" sourceRef="_5" targetRef="_3"/>
--------------------------------------------------------------------------------------
创建数据库、执行方法-------这些需要注意的是务必创建一个新的数据库,因为Activiti会自动生成23张表
以免弄混了
接下来的就是自己的java 测试代码了 自动体会不过多说很简单(去官网看API)
package activiti;
import org.activiti.engine.*;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.task.Task;
import org.junit.Test;
import java.util.List;
/**
* @auther 德哲
* @date 2018/10/19 14:05.
*/
public class ActiviTest {
/**
* 会默认按照Resources目录下的activiti.cfg.xml创建流程引擎
*/
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
@Test
public void Test() {
// 以下两种方式选择一种创建引擎方式:
// 1.配置写在程序里
testCreateProcessEngine();
// 2.读对应的配置文件
testCreateProcessEngineByCfgXml();
deployProcess();
startProcess();
queryTask();
}
/**
* 测试activiti环境
*/
@Test
public void testCreateProcessEngine() {
ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
cfg.setJdbcDriver("com.mysql.jdbc.Driver");
cfg.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/workflows?serverTimezone=UTC");
cfg.setJdbcUsername("root");
cfg.setJdbcPassword("root");
// 配置建表策略
cfg.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine engine = cfg.buildProcessEngine();
}
/**
* 根据配置文件activiti.cfg.xml创建ProcessEngine
*/
@Test
public void testCreateProcessEngineByCfgXml() {
ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
ProcessEngine engine = cfg.buildProcessEngine();
}
/**
* 发布流程
* RepositoryService
*/
@Test
public void deployProcess() {
RepositoryService repositoryService = processEngine.getRepositoryService();
DeploymentBuilder builder = repositoryService.createDeployment();
builder.addClasspathResource("leave.bpmn");
builder.deploy();
}
/**
* 启动流程
* RuntimeService
*/
@Test
public void startProcess() {
RuntimeService runtimeService = processEngine.getRuntimeService();
//可根据id、key、message启动流程
runtimeService.startProcessInstanceByKey("myProcess_1");
}
/**
* 查看任务
* TaskService
*/
@Test
public void queryTask() {
TaskService taskService = processEngine.getTaskService();
//根据assignee(代理人)查询任务
String assignee = "emp";
List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
int size = tasks.size();
for (int i = 0; i < size; i++) {
Task task = tasks.get(i);
}
for (Task task : tasks) {
System.out.println("taskId:" + task.getId() +
",taskName:" + task.getName() +
",assignee:" + task.getAssignee() +
",createTime:" + task.getCreateTime());
}
}
/**
* 办理任务
*/
@Test
public void handleTask() {
TaskService taskService = processEngine.getTaskService();
//根据上一步生成的taskId执行任务
String taskId = "20008";
taskService.complete(taskId);
}
}
==========================================================
下面是activiti.cfg.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="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/workflows?serverTimezone=UTC" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="root" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
</beans>
5种数据库表说明:
Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。
ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。