Activiti7的使用

1.什么是工作流?

1.1工作流介绍

工作流:通过计算机对业务流程自动化执行管理。多个参与者按照某种预定规则自动进行传递文档、信息任务处理的过程。

1.2工作流系统

一个软件系统中具有工作流的功能,我们把它称为工作流系统。

1.3工作流实现方式

  • 采用状态字段的值来跟踪流程的变化情况
  • 程序可以不用改变,业务流程可变化。

1.4工作流原理分析

2.什么是Activiti7

Activiti 是一个工作流引擎, activiti 可以将业务系统中复杂的业务流程抽取出来,使用专门的
建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统业务
流程由 activiti 进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统
健壮性,同时也减少了系统开发维护成本。

官方网址:https://www.activiti.org/

2.1BPMN

BPMN(Business Process Model And Notation)- 业务流程模型和符号 是由 BPMI(Business

Process Management Initiative)开发的一套标准的业务流程建模符号,使用 BPMN 提供的符号可以

创建业务流程。提供一套标准的业务流程符号,表示流程。

活动用圆角矩形表示,一个流程由一个活动或多个活动组成

一个 bpmn 图形的例子:

  1. 首先当事人发起一个请假单;

  2. 其次他所在部门的经理对请假单进行审核;

  3. 然后人事经理进行复核并进行备案;

  4. 最后请假流程结束


Bpmn 图形其实是通过 xml 表示业务流程,上边的.bpmn 文件使用文本编辑器打开:

2.2Activiti如何使用?

  1. 部署activiti

    Activiti 是一个工作流引擎(其实就是一堆 jar 包 API),业务系统使用 activiti 来对系统的业务流

    程进行自动化管理,为了方便业务系统访问(操作)activiti 的接口或功能,通常将 activiti 环境与业务

    系统的环境集成在一起

  2. 流程定义

    使用建模工具定义业务流程(.bpmn文件),.bpmn 文件就是业务流程定义文件,通过 xml 定义业务流程

  3. 流程定义部署

    向 activiti 部署业务流程定义(.bpmn 文件)

  4. 启动一个流程实例

  5. 查询待办任务

  6. 处理任务

  7. 流程结束

2.3 Activiti支持的数据库

2.4 创建mysql数据库

数据库表的命名规则

Activiti 的表都以 **ACT_**开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的 API 对

应。

ACT_RE_*: 'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,

规则,等等)。

ACT_RU_*: 'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,

等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删

除这些记录。 这样运行时表可以一直很小速度很快。

ACT_HI_*: 'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等

等。

ACT_GE_*: GE 表示 general。通用数据, 用于不同场景下

2.5.Activiti服务架构图

2.6 activiti.cfg.xml

activiti 的引擎配置文件,包括:ProcessEngineConfiguration 的定义、数据源定义、事务管理器等,此文件其实就是一个 spring 配置文件,下面是一个基本的配置只配置ProcessEngineConfiguratio和数据源

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
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-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-3.1.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/activiti" />
<property name="username" value="root" />
<property name="password" value="mysql" />
</bean>
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 数据源 --> <property name="dataSource" ref="dataSource" />
<!-- 数据库策略 --> <property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>

2.7ProcessEngineConfiguration

流程引擎的配置类,通过ProcessEngineConfiguration可以创建工作流引擎 ProceccEngine

源码可以自己分析

2.8.Activiti7整合SpringBoot

Activiti7 发布正式版之后,它与 SpringBoot2.x 已经完全支持整合开发。我们可以将 Activiti7 与SpringBoot 整合开发的坐标引入到工程中,从而达到 SpringBoot 支持 Activti7 整合。

具体步骤如下:

步骤一:引入依赖

                <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.4.RELEASE</version></parent><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring-boot-starter</artifactId><version>7.0.0.Beta2</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.38</version></dependency>

步骤二:配置文件application.yml

spring:datasource:url: jdbc:mysql://192.168.1.168:3306/activiti7?useUnicode=true&characterEncoding=utf8&serverTimezone=GMTusername : yunsompassword : yunsom.comdriver-class-name: com.mysql.jdbc.Driver

步骤三:将SpringSecurity配置添加到项目当中

1.SecurityUtil.java 关于权限登陆

@Component
public class SecurityUtil {@Autowiredprivate UserDetailsService userDetailsService;public void logInAs(String username) {UserDetails user = userDetailsService.loadUserByUsername(username);if (user == null) {throw new IllegalStateException("User " + username + " doesn't exist, please provide a valid user");}SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() {@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return user.getAuthorities();}@Overridepublic Object getCredentials() {return user.getPassword();}@Overridepublic Object getDetails() {return user;}@Overridepublic Object getPrincipal() {return user;}@Overridepublic boolean isAuthenticated() {return true;}@Overridepublic void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {}@Overridepublic String getName() {return user.getUsername();}}));org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username);}
}

2.DemoApplicationConfiguration 关于权限配置

@Configuration
@EnableWebSecurity
public class DemoApplicationConfiguration extends WebSecurityConfigurerAdapter {private Logger logger = LoggerFactory.getLogger(DemoApplicationConfiguration.class);@Override@Autowiredpublic void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(myUserDetailsService());}@Beanpublic UserDetailsService myUserDetailsService() {InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();String[][] usersGroupsAndRoles = {{"salaboy", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"ryandawsonuk", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"erdemedeiros", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"other", "password", "ROLE_ACTIVITI_USER", "GROUP_otherTeam"},{"admin", "password", "ROLE_ACTIVITI_ADMIN"},};for (String[] user : usersGroupsAndRoles) {List<String> authoritiesStrings = Arrays.asList(Arrays.copyOfRange(user, 2, user.length));logger.info("> Registering new user: " + user[0] + " with the following Authorities[" + authoritiesStrings + "]");inMemoryUserDetailsManager.createUser(new User(user[0], passwordEncoder().encode(user[1]),authoritiesStrings.stream().map(s -> new SimpleGrantedAuthority(s)).collect(Collectors.toList())));}return inMemoryUserDetailsManager;}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic();}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

步骤四:启动工程

@SpringBootApplication
public class StartActiviti {public static void main(String[] args) {SpringApplication.run(StartActiviti.class,args);}
}

自动部署:

注意问题:
  1.Activiti7和SpringSecurity耦合,需要加入SpringSecurity的依赖和配置,我们可以使用Security中的用户角色组定义流程执行的组
  2.流程默认可自动部署,但是需要再resources/processes文件夹,将流程文件放入当中

2.9 流程执行代码示例:

controller

@RestController
@RequestMapping("/activiti")
public class ActivitiController {@Resourceprivate ProcessRuntime processRuntime;@Resourceprivate TaskRuntime taskRuntime;@Resourceprivate SecurityUtil securityUtil;/*** 查询流程定义*/@RequestMapping("/getProcess")public void getProcess(){//查询所有流程定义信息Page<ProcessDefinition> processDefinitionPage = processRuntime.processDefinitions(Pageable.of(0, 10));System.out.println("当前流程定义的数量:"+processDefinitionPage.getTotalItems());//获取流程信息for (ProcessDefinition processDefinition:processDefinitionPage.getContent()) {System.out.println("流程定义信息"+processDefinition);}}/*** 启动流程示例*/@RequestMapping("/startInstance")public void startInstance(){ProcessInstance instance = processRuntime.start(ProcessPayloadBuilder.start().withProcessDefinitionKey("demo").build());System.out.println(instance.getId());}/*** 获取任务,拾取任务,并且执行*/@RequestMapping("/getTask")public void getTask(){securityUtil.logInAs("salaboy");        //指定组内任务人Page<Task> tasks = taskRuntime.tasks(Pageable.of(0, 10));if(tasks.getTotalItems()>0){for (Task task:tasks.getContent()) {System.out.println("任务名称:"+task.getName());//拾取任务taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());//执行任务taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()).build());}}}
}

1.查询流程定义

需要先经过权限验证

账号密码在DemoApplicationConfiguration配置类

String[][] usersGroupsAndRoles = {{"salaboy", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"ryandawsonuk", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"erdemedeiros", "password", "ROLE_ACTIVITI_USER", "GROUP_activitiTeam"},{"other", "password", "ROLE_ACTIVITI_USER", "GROUP_otherTeam"},{"admin", "password", "ROLE_ACTIVITI_ADMIN"},};

控制台打印信息:

2.启动流程示例

Activiti7实战-入门相关推荐

  1. Activiti7实战入门一:请假单流程的制定以及代码实现

    目录 目标 1.依赖 2.画流程图 2.1 变量设置 2.2 关于表单属性 3. SpringCloud环境跑流程 3.1 部署流程文件 3.2 新建流程实例 3.3 填写请假申请 3.4 列出待处理 ...

  2. 数据中台实战入门篇:数据中台对内、对外合作机制

    前言 之前文章讲了 <数据中台实战入门篇:双中台战略>,主要解决了什么是中台.什么是数据中台.业务中台.什么公司适合搭建双中台体系这几个问题.本篇文章讲一下数据中台的人员构成.内部如何合作 ...

  3. python爬虫多url_Python爬虫实战入门六:提高爬虫效率—并发爬取智联招聘

    之前文章中所介绍的爬虫都是对单个URL进行解析和爬取,url数量少不费时,但是如果我们需要爬取的网页url有成千上万或者更多,那怎么办? 使用for循环对所有的url进行遍历访问? 嗯,想法很好,但是 ...

  4. [菜鸟SpringCloud实战入门]第七章:配置中心客户端主动刷新机制 + 配置中心服务化和高可用改造...

    前言 欢迎来到菜鸟SpringCloud实战入门系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud. 本系列适合有一定Java以及Sp ...

  5. 跟我一起学.NetCore之EF Core 实战入门,一看就会

    前言 还记得当初学习数据库操作时,用ADO.NET一步一步地进行数据操作及查询,对于查询到的数据还得对其进行解析,然后封装返回给应用层:遇到这种重复而繁琐的工作,总有一些大神或团队对其进行封装,从而出 ...

  6. 《ASP.NET Core项目开发实战入门》送书活动结果公布

    截至2020.09.20 本次送书活动<ASP.NET Core项目开发实战入门>.下面把Top 5的留言截图给大家回顾一下. 以下5位同学将获赠书籍一本: 小林子 鉴 静 红脸先生 阿星 ...

  7. 送福利 | 送书5本《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发

    <ASP.NET Core项目开发实战入门>从基础到实际项目开发部署带你走进ASP.NET Core开发. ASP.NET Core项目开发实战入门是基于ASP.NET Core 3.1 ...

  8. Asp.NET Core2.0 项目实战入门视频课程_完整版

    END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了.52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不 ...

  9. [菜鸟SpringCloud实战入门]第九章:服务网关Zuul体验

    前言 欢迎来到菜鸟SpringCloud实战入门系列(SpringCloudForNoob),该系列通过层层递进的实战视角,来一步步学习和理解SpringCloud. 本系列适合有一定Java以及Sp ...

  10. 02-k8s资源管理与实战入门

    1.资源管理 1.1 资源管理介绍 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes. kubernetes的本质上就是一个集群系统,用户可以在集群中部 ...

最新文章

  1. yum安装软件包提示Error Downloading Packages解决方法
  2. DOS批处理延时技术
  3. 【PAT乙级】1089 狼人杀-简单版 (20 分)
  4. 深入浅出 5种IO模型。
  5. python如何打印时间,在python2.7中,如何提取和打印日期、时间和m
  6. OpenCASCADE:教程概述
  7. LSGO软件技术团队2015~2016学年第十三周(1123~1129)总结
  8. Delphi语言最好的JSON代码库 mORMot学习笔记1
  9. 【ICLR2020】看未知观测:一种简单的蒙特卡洛并行化方法
  10. 卷积运算和运算后特征图大小计算2
  11. mysql生成varchar类型主键排序
  12. 小程序 tab 切换点击无效
  13. (超详细)手把手教你在安卓手机上搭建服务器和网站
  14. Mysql—— 内连接、左连接、右连接以及全连接查询
  15. servlet工作流程
  16. java学期总结_JAVA学期总结
  17. SSL证书收费的原因
  18. 苹果开发者账号网页版续费失败支付报错解决办法
  19. 古典微分几何 近代微分几何资料
  20. 可以跟风不看好瑞幸,但真该相信浑水这份方法论偏差的报告吗?

热门文章

  1. python爬虫简历项目怎么写_爬虫项目咋写,爬取什么样的数据可以作为项目写在简历上?...
  2. 对接网络摄像头——使用RTSP协议进行取流
  3. android数据适配器参数,Android 万能适配器BRVAH
  4. 微信群裂变不起来怎么办?
  5. 4、Android 主流数据库框架
  6. 自媒体文章采集工具,采集多个平台的文章
  7. 使用 JMeter 进行API接口压力测试
  8. vscode vue开发环境搭建
  9. java中怎么读取txt文件_Java读取TXT文件
  10. 威纶通触摸屏上传错误_威伦触摸屏程序上传方式