activiti操作流程的几个demo

1.详细查看github的代码

https://github.com/mx342/luceneDemo

2.pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.cyjz</groupId>
    <artifactId>activiti</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>activiti</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <activiti.version>7.0.0.Beta1</activiti.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

        <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-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.11</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-model</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-converter</artifactId>
            <version>${activiti.version}</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-json-converter</artifactId>
            <version>7.0.0.GA</version>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
            <version>7.0.0.GA</version>
        </dependency>

        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.4</version>
            <exclusions>
                <exclusion>
                    <groupId>tk.mybatis</groupId>
                    <artifactId>mapper-spring-boot-autoconfigure</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-autoconfigure</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3.conf配置(本案例使用的是springboot)

activiti配置

package com.cyjz.activiti.config;

import org.activiti.engine.*;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.spring.ProcessEngineFactoryBean;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

//import org.activiti.spring.SpringProcessEngineConfiguration;

/**
 * Created by liuruijie on 2017/2/20.
 * activiti工作流配置
 */
@Configuration
public class Cfg_Activiti {

    //流程配置,与spring整合采用SpringProcessEngineConfiguration这个实现
    @Bean
    public ProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager){
        SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration();
        processEngineConfiguration.setDataSource(dataSource);
        processEngineConfiguration.setDatabaseSchemaUpdate("true");
        processEngineConfiguration.setDatabaseType("mysql");

        processEngineConfiguration.setTransactionManager(transactionManager);

//        流程图字体
//        processEngineConfiguration.setActivityFontName("宋体");
//        processEngineConfiguration.setAnnotationFontName("宋体");
//        processEngineConfiguration.setLabelFontName("宋体");

        return processEngineConfiguration;
    }

    //流程引擎,与spring整合使用factoryBean
    @Bean
    public ProcessEngineFactoryBean processEngine(ProcessEngineConfiguration processEngineConfiguration){
        ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
        processEngineFactoryBean.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration);
        return processEngineFactoryBean;
    }

    //八大接口
    @Bean
    public RepositoryService repositoryService(ProcessEngine processEngine){
        return processEngine.getRepositoryService();
    }

    @Bean
    public RuntimeService runtimeService(ProcessEngine processEngine){
        return processEngine.getRuntimeService();
    }

    @Bean
    public TaskService taskService(ProcessEngine processEngine){
        return processEngine.getTaskService();
    }

    @Bean
    public HistoryService historyService(ProcessEngine processEngine){
        return processEngine.getHistoryService();
    }
//7里面已经删除了
//    @Bean
//    public FormService formService(ProcessEngine processEngine){
//        return processEngine.getFormService();
//    }
//
//    @Bean
//    public IdentityService identityService(ProcessEngine processEngine){
//        return processEngine.getIdentityService();
//    }

    @Bean
    public ManagementService managementService(ProcessEngine processEngine){
        return processEngine.getManagementService();
    }

    @Bean
    public DynamicBpmnService dynamicBpmnService(ProcessEngine processEngine){
        return processEngine.getDynamicBpmnService();
    }

    //八大接口 end
}

数据源配置:

package com.cyjz.activiti.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import tk.mybatis.spring.annotation.MapperScan;

import javax.sql.DataSource;


@Configuration
@MapperScan(basePackages = "com.cyjz.activiti.pojo.dao.mapper")
public class DataSourceOneConfig {
	

	  @Bean
	  @ConfigurationProperties(prefix = "spring.datasource")
	  @Primary //设置主数据源1
	  public DataSource dataSource(){
	      return new DruidDataSource();
	  }
	
//	  @Bean(name = "sqlSessionFactory")
//	  @Primary
//	  public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSource") DataSource dataSource)throws Exception{
//	      SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
//	      bean.setDataSource(dataSource);
//	      bean.setConfigLocation(new DefaultResourceLoader().getResource("classpath:mybatis/mybatis-config.xml"));
//	      bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/*.xml"));
//	      return bean.getObject();
//	  }
//
//	  @Bean(name = "sqlSessionTemplate")
//	  @Primary
//	  public SqlSessionTemplate sqlSessionTemplateOne(@Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory)throws Exception{
//	      return new SqlSessionTemplate(sqlSessionFactory);
//	  }
	  
}

yml配置:

spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
  datasource:
    #第一个数据源
    username: root
    password: mysql
    #    url: jdbc:mysql://120.26.82.31:3306/tianyou?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
    url: jdbc:mysql://127.0.0.1:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=UTC
#    url: jdbc:mysql://47.111.69.10:3306/tianyou?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true
    hostIp: 120.77.223.232
    dbName: tianyou

4.demo代码

package com.cyjz.activiti;

import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.history.HistoricDetailQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import sun.nio.ch.IOUtil;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipInputStream;

@RunWith(SpringRunner.class)
@SpringBootTest
public class ActivitiApplicationTests {
    
    @Autowired
    ProcessEngine processEngine;

    @Autowired
    ProcessEngineConfiguration processEngineConfiguration;
    /**
     * 作者 ZYL
     * 功能描述 : 生成表,整个程序只需要执行一次
     * 日期 2019/5/3 11:22
     * 参数
     * 返回值 void
     */
    @Test
    public void testGeTable(){
//        1.创建processEngineConfiguration对象
//        @Autowired
//        2.创建processEngine对象
        ProcessEngine processEngine = processEngineConfiguration.buildProcessEngine();
//        processEngine.get

        //3.输出processEngine对象
        System.err.println(processEngine);

    }


    /**
     * 作者 ZYL
     * 功能描述 : 流程定义4步骤
     * 日期 2019/5/3 19:38  
     * 参数 
     * 返回值 void
     */
    @Test
    public void processDefine() {
        //1.获得activiti相关service
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        System.err.println(repositoryService);
        //2.createDeployment方法进行部署
        Deployment deploy = repositoryService.createDeployment()
                .addClasspathResource("static/diagram/holiday.png")
                .addClasspathResource("static/diagram/holiday.bpmn")
                .name("请假申请")
                .deploy();
        //3.输出部署的一些信息
        System.err.println("流程部署id:" + deploy.getId());
        System.err.println("流程部署名称:" + deploy.getName());
    }

    
    /**
     * 作者 ZYL
     * 功能描述 : 启动流程实例,前提是已经完成流程定义的部署工作
     * 背后影响的表:
     *  act_hi_actinst  已完成的活动实例
     *  act_hi_identitylink 参与者信息
     *  act_hi_procinst  流程实例
     *  act_hi_taskinst  任务实例
     *  act_ru_execution 执行表
     *  act_ru_identitylink 参与者信息
     *  act_ru_task 任务
     * 日期 2019/5/3 20:03  
     * 参数 
     * 返回值 void
     */
    @Test
    public void startProcessInstance(){
        //1.获取runtimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //2.根据流程定义key启动流程,此处需要知道流程定义的key
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday");
        //3.输出实例相关信息
        System.err.println("流程部署id:" + processInstance.getDeploymentId());
        System.err.println("流程实例id:" + processInstance.getId());
        System.err.println("流程定义id:" + processInstance.getProcessDefinitionId());
        System.err.println("流程活动id:" + processInstance.getActivityId());


    }
    /**
     * 作者 ZYL
     * 功能描述 : 查询用户的任务列表,天佑里面使用的是用户工号
     * 日期 2019/5/3 20:29  
     * 参数 
     * 返回值 void
     */
    @Test
    public void findPersonalTaskList(){
        //1.任务负责人
        String assignee = "zhangsan";
        //2.创建TaskService
        TaskService taskService = processEngine.getTaskService();
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("holiday")
                .taskAssignee(assignee)
                .list();
        //任务列表的展示
        for (Task task : list) {
            System.err.println("流程实例id:" + task.getProcessInstanceId());
            System.err.println("任务id:" + task.getId());
            System.err.println("任务责任人:" + task.getAssignee());
            System.err.println("任务名称:" + task.getName());
            System.err.println("======================");
        }
    }
    /*
     * 作者 ZYL
     * 功能描述 : 处理任务完成任务
     * 操作的表:
     *  act_hi_actinst
     *  act_hi_identitylink
     *  act_hi_taskinst
     *  act_ru_execution
     *  act_ru_identitylikn
     *  act_ru_task
     * 日期 2019/5/3 20:36
     * 参数
     * 返回值 void
     */
    @Test
    public void completTask(){
        //任务id 测试为:2505,5005
        String taskId = "22502";
        //创建TaskService
        TaskService taskService = processEngine.getTaskService();
        //完成任务
        taskService.complete(taskId);
        System.err.println("完成任务id:" + taskId);
    }
    /**
     * 作者 ZYL
     * 功能描述 : zip方式部署流程
     * 日期 2019/5/3 21:24
     * 参数
     * 返回值 void
     */
    @Test
    public void deployProcessByZip(){
        //定义zip输入流
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("static/diagram/holiday.zip");
        ZipInputStream zipInputStream = new ZipInputStream(inputStream);
        //获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //流程部署
        Deployment deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();
        System.err.println("流程部署id:" + deployment.getId());
        System.err.println("流程部署名称:" + deployment.getName());
    }
    /**
     * 作者 ZYL
     * 功能描述 : 流程定义的查询
     * 日期 2019/5/3 22:15
     * 参数
     * 返回值 void
     */
    @Test
    public void queryProceccDefinition(){
        //流程定义
        String processDefinitionKey = "holiday";
        //获取repositorySerice
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //查询流程定义
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //遍历查询结果
        List<ProcessDefinition> list = processDefinitionQuery.processDefinitionKey(processDefinitionKey)
                .orderByProcessDefinitionVersion().desc().list();
        for (ProcessDefinition processDefinition : list) {
            System.err.println("------------------");
            System.err.println("流程部署id:" + processDefinition.getId());
            System.err.println("流程定义名称:" + processDefinition.getName());
            System.err.println("流程定义key:" + processDefinition.getKey());
            System.err.println("流程定义版本:" + processDefinition.getVersion());
            System.err.println("流程部署的id:" + processDefinition.getDeploymentId());
        }


    }
    /**
     * 作者 ZYL
     * 功能描述 : 删除已经部署成功的流程定义
     * 日期 2019/5/3 22:32
     * 参数
     * 返回值 void
     */
    @Test
    public void deleteDeployment(){
        //流程部署id
        String deploymentId = "15001";
        //通过流程引擎获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //删除流程定义,如果该流程定义已经有流程实例启动则删除时出错
        repositoryService.deleteDeployment(deploymentId);
        //设置true级联删除流程定义,即时该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
//        repositoryService.deleteDeployment(deploymentId,true);
    }

    /**
     * 作者 ZYL
     * 需求:1.从activiti的act_ge_bytearray表中读取两个资源文件
     *      2.将两个资源文件保存到本地
     *      用户想要查看请假流程具体有哪些步骤要走
     * 技术方案:
     *      1.第一种:使用activiti的api来实现
     *      2.第二种:从原理层jdbc的blob或者clob类型读取
     *      3.IO流转换:最好commons-io.jar可以轻松解决
     * 功能描述 : 通过流程定义对象获取流程定义资源,获取bpmn和png
     * 日期 2019/5/3 23:15
     * 参数 null
     * 返回值
     */
    @Test
    public void getProcessResources() throws Exception{
        //流程定义id
        String processDefinitionKey = "holiday";
        //获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //流程定义对象
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //查询到流程定义
        ProcessDefinition processDefinition = processDefinitionQuery.processDefinitionKey(processDefinitionKey).singleResult();
        //获取部署id
        String deploymentId = processDefinition.getDeploymentId();
        //获取bpmn资源的名称
        String resource_bpmn = processDefinition.getResourceName();
        //获取png图片资源的名称
        String resource_png = processDefinition.getDiagramResourceName();
//
        //通过repositoryService的方法,实现读取图片信息及bpmn文件信息(输入流)
        //getResourceAsStream,两个参数:1.表示部署id,2.表示资源名称
        InputStream pngIs = repositoryService.getResourceAsStream(deploymentId,resource_png);
        InputStream bpmnIs = repositoryService.getResourceAsStream(deploymentId,resource_bpmn);

        //构建outputStream流
        OutputStream pngOs = new FileOutputStream("E:\\BaiduNetdiskDownload\\3-1 Activiti7工作流引擎\\" + resource_png);
        OutputStream bpmnOs = new FileOutputStream("E:\\BaiduNetdiskDownload\\3-1 Activiti7工作流引擎\\" + resource_bpmn);
        //输入流,输出流的转换 commons-io的方法
        IOUtils.copy(pngIs,pngOs);
        IOUtils.copy(bpmnIs,bpmnOs);

        //关闭流
        pngIs.close();
        pngOs.close();
        bpmnIs.close();
        bpmnOs.close();
    }
    
    /**
     * 作者 ZYL
     * 功能描述 : 流程历史信息的查看
     * 描述:即时流程定义已经删除了,流程执行的历史信息通过前面的分析,依然保存在activiti的act_hi_*的相关表中,所以我们还是可以查询流程执行的历史信息,
     * 可以通过HistoryService来查看相关记录
     * 日期 2019/5/3 23:48  
     * 参数 null
     * 返回值
     */
    @Test
    public void testHistory01(){
        //获取historyService对象
        HistoryService historyService = processEngine.getHistoryService();
        //获取查询对象
        HistoricActivityInstanceQuery query = historyService.createHistoricActivityInstanceQuery();
        //添加查询条件
        query.processInstanceId("17501");
        //执行查询
        List<HistoricActivityInstance> list = query.list();
        //遍历结果
        for (HistoricActivityInstance historicActivityInstance : list) {
            System.err.println("activitiId:" + historicActivityInstance.getActivityId());
            System.err.println("activitiName:" + historicActivityInstance.getActivityName());
        }

    }

}

 

 

 

如果觉得本文对您有所帮助,欢迎您扫码下图所示的支付宝和微信支付二维码对本文进行随意打赏。您的支持将鼓励我继续创作

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activiti是一个基于Java的开源工作流引擎,可以通过它来实现各种复杂的业务流程Activiti的全流程demo通常包含以下几个关键步骤: 1. 流程定义:首先需要定义工作流程的各个节点和步骤。可以使用Activiti的图形化建模工具,也可以通过编写BPMN(Business Process Model and Notation,业务流程建模与标注)文件进行定义。建模工具可以帮助用户创建流程的各个活动、节点、网关以及连接它们的顺序和条件。 2. 流程部署:定义好工作流程后,需要将其部署到Activiti引擎中。部署可以在应用程序启动时自动完成,也可以通过Activiti提供的API手动部署。部署完成后,工作流程就可以开始执行了。 3. 流程实例启动:启动工作流程的实例,可以通过调用Activiti的API来完成,也可以通过Activiti提供的用户界面来完成。启动一个实例就相当于把定义好的工作流程拷贝一份,并将其设置为活动的状态,可以进行后续的操作。 4. 任务分配与处理:在工作流程中,不同的节点会有不同的任务需要处理。当某个任务需要分配给某个用户或组时,Activiti可以根据事先定义的规则,自动将任务分配给合适的人员。被分配的人员可以通过Activiti提供的任务列表,查询自己待办的任务,并进行处理。 5. 任务处理:被分配任务的人员可以根据自己的权限和职责,对任务进行处理,可以是完成、驳回、转办等操作。处理完成后,任务会自动流转到下一个节点,待下一个人员处理。 6. 流程结束:当工作流程中的所有任务都被处理完成时,工作流程就会结束。可以在流程结束后进行相关的收尾工作,如数据归档、统计等。 综上所述,activiti流程demo包含流程定义、流程部署、流程实例启动、任务分配与处理以及流程结束等关键步骤。通过这些步骤,可以实现一个完整的工作流程,提高工作效率和流程管理的可控性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值