Activiti7实战-入门

Activiti7实战-入门Activiti7的使用和原理1.什么是工作流?1.1工作流介绍工作流:通过计算机对业务流程自动化执行管理。多个参与者按照某种预定规则自动进行传递文档、信息任务处理的过程。1.2工作流系统一个软件系统中具有工作流的功能,我们把它称为工作流系统。1.3工作流实现方式采用状态字段的值来跟踪流程的变化情况程序可以不用改变,业务流程可变化。1.4工作流原理分析2.什么是Activiti7Activiti是一个工作流引擎,activiti可以将业务系统中复杂的业务流程抽取

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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.xsd http://www.springframework.org/schema/tx http://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>

Jetbrains全家桶1年46,售后保障稳定

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=GMT
username : yunsom
password : yunsom.com
driver-class-name: com.mysql.jdbc.Driver

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

1.SecurityUtil.java 关于权限登陆

@Component
public class SecurityUtil { 

@Autowired
private 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() { 

@Override
public Collection<? extends GrantedAuthority> getAuthorities() { 

return user.getAuthorities();
}
@Override
public Object getCredentials() { 

return user.getPassword();
}
@Override
public Object getDetails() { 

return user;
}
@Override
public Object getPrincipal() { 

return user;
}
@Override
public boolean isAuthenticated() { 

return true;
}
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { 

}
@Override
public 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
@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(myUserDetailsService());
}
@Bean
public 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;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic();
}
@Bean
public 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 {
@Resource
private ProcessRuntime processRuntime;
@Resource
private TaskRuntime taskRuntime;
@Resource
private 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"},
};

img

控制台打印信息:

img

2.启动流程示例

img

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179404.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Matlab plot绘图颜色详解

    Matlab plot绘图颜色详解转自:https://blog.csdn.net/jirryzhang/article/details/77374702MATLABplot画线的颜色设定plot中画线的颜色通常是八种:标记符颜色r红g绿b蓝c蓝绿m紫红y…

  • 课设-基于51单片机的智能小车(循迹+避障+APP控制)[通俗易懂]

    课设-基于51单片机的智能小车(循迹+避障+APP控制)[通俗易懂]基于51单片机的智能小车,可以实现循迹、避障、APP控制等功能;顺便提了一下自己大学的“造车”史!

    2022年10月11日
  • MySQL慢查询日志分析详解[通俗易懂]

    MySQL慢查询日志分析详解[通俗易懂]MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢…

    2022年10月12日
  • vs的安装包_vs2019制作安装包

    vs的安装包_vs2019制作安装包VS安装包注册com组件VS安装包注册com组件1.把你的com组件加入到打包程序。 2.在打包程序中找到该com组件,点击属性。在属性中有Register项,把值选择为vsdrfCOM即可。

  • class和getClass()的区别

    class和getClass()的区别前几天做项目,觉得自己都开发一年多了,还没有自己封装的类,感觉真是白做了,再加上,看到自己的代码,我都不忍心看,有的时候,还需要自己去读自己写的代码,乱乱糟糟的,实在不忍心看,没办法,重现在开始吧,把自己需要的,都封装起来,用到什么的时候,在哪来用,方便,快捷首先是自己封装的基类baseActivity,不废话,直接上代码(其他的就不贴出来了,只有这个地方有错误)packagecom.d

  • Stopwatch用法

    Stopwatch用法获取系统时间计算System.currentTimeMillis()Stopwatch对程序部分代码进行计时(ms级别),适用于同步单线程代码块。StopWatch实例一次只能开启一个task,不能同时start多个task,并且在该task未stop之前不能start一个新的task,必须在该taskstop之后才能开启新的task,若要一次开启多个,需要new不同的StopWatch实例//只输出运行多少秒Stopwatchstopwatch=Stopwatch.creat.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号