工作流引擎Flowable

这里写目录标题

  • 1.Flowable基础
    • 1.1 入门学习
  • 2.流程图设计器
    • 2.1 FlowableUI
    • 2.1.1 绘制流程图

1.Flowable基础

官方手册

1.1 入门学习

一、依赖

<dependencies>
    <dependency>
        <groupId>org.flowablegroupId>
        <artifactId>flowable-engineartifactId>
        <version>6.3.0version>
    dependency>

    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>8.0.21version>
    dependency>

    <dependency>
        <groupId>junitgroupId>
        <artifactId>junitartifactId>
        <version>4.13.2version>
    dependency>
    
	<dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-apiartifactId>
        <version>1.7.21version>
    dependency>

    <dependency>
        <groupId>org.slf4jgroupId>
        <artifactId>slf4j-log4j12artifactId>
        <version>1.7.21version>
    dependency>

dependencies>

二、demo

@Test
public void testProcessEngine() {
    // 获取config对象
    ProcessEngineConfiguration config = new StandaloneProcessEngineConfiguration();
    // 设置数据库连接
    config.setJdbcDriver("com.mysql.cj.jdbc.Driver");
    config.setJdbcUsername("root");
    config.setJdbcPassword("root");
    // 注意:要添加nullCatalogMeansCurrent=true属性, 不然会执行报错
    config.setJdbcUrl("jdbc:mysql://localhost:3306/flowable?serverTimezone=UTC&nullCatalogMeansCurrent=true");
    // 如果数据库中的表结构不存在, 就新建
    config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
    // 构建我们需要的对象
    ProcessEngine processEngine = config.buildProcessEngine();
}

三、日志文件
在resources中添加日志文件log4j.properties

log4j.rootLogger=DEBUG, CA

log4j.appender.CA=org.apache.log4j.ConsoleAppender
log4j.appender.CA.layout=org.apache.log4j.PatternLayout
log4j.appender.CA.layout.ConversionPattern= %d{hh:mm:ss,SSS} [%t] %-5p %c %x - %m%n

2.流程图设计器

Flowable流程图

  • Eclipse Designer, 一款Eclipse插件, 用于图形化建模, 测试与部署BPMN2.0流程
  • FlowableUI
  • Flowable BPMN visualizer, 一款idea插件

2.1 FlowableUI

从官网下载flowable-6.7.2.zip解压后, 可以看到如下两个文件
工作流引擎Flowable_第1张图片
将这两个文件, 扔到tomcat中, 并启动tomcat
工作流引擎Flowable_第2张图片
之后我们就可以在网页中访问FlowableUI
访问地址
账户密码:admin/test
工作流引擎Flowable_第3张图片

2.1.1 绘制流程图

一、创建流程
创建一个简单的请假流程
开始 > 提交审核流程(user1) > 总经理审批流程(user2) > 结束
工作流引擎Flowable_第4张图片
二、部署
绘制好的流程图, 我们只需要一键导出即可(BPMN文件)
工作流引擎Flowable_第5张图片
下载后, 将文件复制到idea中
工作流引擎Flowable_第6张图片

private ProcessEngineConfiguration config;

    @Before
    public void before() {
        // 获取config对象
        config = new StandaloneProcessEngineConfiguration();
        // 设置数据库连接
        config.setJdbcDriver("com.mysql.cj.jdbc.Driver");
        config.setJdbcUsername("root");
        config.setJdbcPassword("root");
        // 注意:要添加nullCatalogMeansCurrent=true属性, 不然会执行报错
        config.setJdbcUrl("jdbc:mysql://localhost:3306/flowable?serverTimezone=UTC&nullCatalogMeansCurrent=true");
        // 如果数据库中的表结构不存在, 就新建
        config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
    }

    /**
     * 部署流程
     */
    @Test
    public void testDeploy() {
        // 1.获取ProcessEngine对象
        ProcessEngine processEngine = config.buildProcessEngine();
        // 2.获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 3.完成流程的部署操作
        repositoryService.createDeployment()
                .addClasspathResource("MyHolidayUI.bpmn20.xml")
                .name("请求流程")
                .deploy();
    }
}

执行部署后, 我们回头看看表中的数据
act_re_procdef
act_re_deployment

三、执行流程

@Test
public void testRun() {
    // 1.获取ProcessEngine对象
    ProcessEngine processEngine = config.buildProcessEngine();
    // 2.获取runtimeService
    RuntimeService runtimeService = processEngine.getRuntimeService();
    // 3.启动流程实例
    ProcessInstance processInstance = runtimeService.startProcessInstanceById("MyHolidayUI:1:4");
    System.out.println("processDefinitionId = " + processInstance.getProcessDefinitionId());
    System.out.println("activityId = " + processInstance.getActivityId());
    System.out.println("id = " + processInstance.getId());
}

在这里插入图片描述
可以通过act_ru_task查看任务流程
在这里插入图片描述
在这里插入图片描述

四、用户处理
user1对任务进行处理

@Test
public void testCompleteTask() {
    // 1.获取ProcessEngine对象
    ProcessEngine processEngine = config.buildProcessEngine();
    // 2.获取TaskService
    TaskService taskService = processEngine.getTaskService();
    // 3.获取任务
    Task task = taskService.createTaskQuery()
            .processDefinitionKey("MyHolidayUI")
            .taskAssignee("user1")
            .singleResult();
    // 4.创建流程变量
    HashMap<String, Object> map = new HashMap<>();
    map.put("approved", false);
    // 5.完成任务
    taskService.complete(task.getId(), map);
}

处理完成后, 任务就流转到user2了
在这里插入图片描述
user2对任务进行处理

@Test
public void testCompleteTask() {
    // 1.获取ProcessEngine对象
    ProcessEngine processEngine = config.buildProcessEngine();
    // 2.获取TaskService
    TaskService taskService = processEngine.getTaskService();
    // 3.获取任务
    Task task = taskService.createTaskQuery()
            .processDefinitionKey("MyHolidayUI")
            .taskAssignee("user2")
            .singleResult();
    // 4.创建流程变量
    HashMap<String, Object> map = new HashMap<>();
    map.put("approved", false);
    // 5.完成任务
    taskService.complete(task.getId(), map);
}

user2处理完成后, 任务就结束了, 在task表中就删除了这条记录
在这里插入图片描述
五、查看历史信息

@Test
public void testHistory() {
    // 1.获取ProcessEngine对象
    ProcessEngine processEngine = config.buildProcessEngine();
    // 2.获取historyService
    HistoryService historyService = processEngine.getHistoryService();
    // 3.获取任务
    List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
            .processDefinitionId("MyHolidayUI:1:4")
            .finished() // 查询已完成的历史记录
            .orderByHistoricActivityInstanceEndTime().asc() // 指定排序的字段
            .list();

    for (HistoricActivityInstance history : list) {
        System.out.println(history.getActivityName() + ":" + history.getAssignee() + "--"
                + history.getActivityId() + ":" + history.getDurationInMillis() + "毫秒");
    }
}

你可能感兴趣的:(log4j,apache,java)