Activiti7实战-入门

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>

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值