Activiti7实战-入门

2022-11-19 16:55:22 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

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和数据源

代码语言:javascript复制
<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 整合。

具体步骤如下:

步骤一:引入依赖
代码语言:javascript复制
                <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
代码语言:javascript复制
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 关于权限登陆

代码语言:javascript复制
@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 关于权限配置

代码语言:javascript复制
@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();
}
}
步骤四:启动工程
代码语言:javascript复制
@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

代码语言:javascript复制
@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配置类

代码语言:javascript复制
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.启动流程示例

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

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

0 人点赞