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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 常用的css文件_css常用的三种选择器

    常用的css文件_css常用的三种选择器reset.css(几乎每个项目都要引入的css)@charset"utf-8";html{background-color:#fff;color:#000;font-size

    2022年8月1日
    1
  • Ettercap Notes

    Ettercap NotesEttercapIthastwomainsniffingoptions:UNIFIEDthismethodsniffsallthepacketsthatpassonthecable.YoucanchoosetoputtheinterfaceinpromiscmodeornotFurthermore…

    2022年6月28日
    30
  • Oracle创建新用户[通俗易懂]

    Oracle创建新用户[通俗易懂]Oracle新用户创建1,数据库链接黑窗口输入:sqlplus/assysdba 连接数据库2,表空间创建输入 createtablespacetestdatafile’D:\Oracle\oradata\test.dbf’size50M;创建数据库表空间; test 表空间名称 D:\Oracle\oradata\test.dbf 表空间文件路径\文件名称 50M 表空间大小补充:1),若表空间

    2022年5月12日
    34
  • 图形的遍历

    图形的遍历一个图形G=(V,E),存在某一顶点v,希望从v开始,通过此顶点相邻的顶点而去访问G中其他顶点直达全部的顶点遍历完毕。在遍历的过程中可能会重复经过某些顶点及边线,经由图形的遍历可以判断该图形是否连通,并找出连通单元和路径。图形遍历有两种方法:深度优先搜索Deep-First-Search广度优先搜索Breadth-First-Search一、深度优先搜索从图形的某一顶点开始遍历,被访问过的

    2022年6月8日
    47
  • javascript Date format(js日期格式化)

    javascript Date format(js日期格式化)这个很不错,好像是csdn的Meizz写的://对Date的扩展,将Date转化为指定格式的String//月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q)可以用1-2个占位符,//年(y)可以用1-4个占位符,毫秒(S)只能用1个占位符(是1-3位的数字)//例子://(newDate()).Format(“yyyy-MM-ddhh:mm:ss.S”)==>2006-07-0208:09:04.423//(newDate())

    2022年4月30日
    36
  • Vue(6)v-on指令的使用[通俗易懂]

    Vue(6)v-on指令的使用[通俗易懂]v-on监听事件可以用v-on指令监听DOM事件,并在触发时运行一些JavaScript代码。事件代码可以直接放到v-on后面,也可以写成一个函数。示例代码如下:<divid

    2022年7月29日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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