SpringBoot中引入Activiti並完成基本業務流程


Activiti

DB中各個表的作用

Activiti的后台是有數據庫的支持,所有的表都以ACT_開頭。 第二部分是表示表的用途的兩個字母標識。 用途也和服務的API對應。
ACT_RE_*: 'RE'表示repository。 這個前綴的表包含了流程定義和流程靜態資源 (圖片,規則,等等)。
ACT_RU_*: 'RU'表示runtime。 這些運行時的表,包含流程實例,任務,變量,異步任務,等運行中的數據。 Activiti只在流程實例執行過程中保存這些數據, 在流程結束時就會刪除這些記錄。 這樣運行時表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 這些表包含身份信息,比如用戶,組等等。
ACT_HI_*: 'HI'表示history。 這些表包含歷史數據,比如歷史流程實例, 變量,任務等等。
ACT_GE_*: 通用數據, 用於不同場景下,如存放資源文件。

兩種整合方式

不使用SpringBootStarter

依賴
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring</artifactId>
        <version>6.0.0</version>
    </dependency>
    <!--其他依賴有需要再加-->
數據源
server:
  port: 80

spring:
  datasource:
    url: jdbc:mysql://121.41.224.124:3307/activiti1?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=true&autoReconnect=true
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123


  activiti:
    database-schema-update: true
    check-process-definitions: true
    process-definition-location-prefix: classpath:/processes/
    #    process-definition-location-suffixes:
    #      - **.bpmn
    #      - **.bpmn20.xml
    history-level: full

需要注意的是,在url中,添加了針對數據庫的條件,其中最后一條nullCatalogMeansCurrent=true非常重要,至於有什么用就不概述了,但是沒有這條語句的話就無法自動創建對應的二十八張表

配置
@Configuration
public class ActivitiConfig {
    /*
    * 配置分為以下幾步驟
    * 1. 創建ActivitiConfig
    * 2. 使用ActivitiConfig創建ProcessEngineFactoryBean
    * 3. 使用ProcessEngineFactoryBean創建ProcessEngine對象
    * 4. 使用ProcessEngine對象創建需要的服務對象
    * */
    private Logger logger = LoggerFactory.getLogger(ActivitiConfig.class);

    private final DataSource dataSource;

    private final PlatformTransactionManager platformTransactionManager;
    @Autowired
    public ActivitiConfig(DataSource dataSource, PlatformTransactionManager platformTransactionManager) {
        this.dataSource = dataSource;
        this.platformTransactionManager = platformTransactionManager;
    }
/*
* 1. 創建配置文件,也就是提供一些配置信息,這樣就可以自定義自己的創建信息了
* 需要一些參數,1. 數據源。2. 事務管理器。
* 這里還加入了自動掃描process包下的bpmn(流程定義文件)的設置,這樣就可以省去了部署
 * */
    @Bean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration() {
        SpringProcessEngineConfiguration spec = new SpringProcessEngineConfiguration();
        spec.setDataSource(dataSource);
        spec.setTransactionManager(platformTransactionManager);
        spec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        Resource[] resources = null;
        // 啟動自動部署流程
        try {
            resources = new PathMatchingResourcePatternResolver().getResources("classpath*:process/*.bpmn");
        } catch (IOException e) {
            e.printStackTrace();
        }
        spec.setDeploymentResources(resources);
        return spec;
    }

    @Bean
    public ProcessEngineFactoryBean processEngine() {
        ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
        processEngineFactoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration());
        return processEngineFactoryBean;
    }

    @Bean
    public RepositoryService repositoryService() throws Exception {
        return processEngine().getObject().getRepositoryService();
    }

    @Bean
    public RuntimeService runtimeService() throws Exception {
        return processEngine().getObject().getRuntimeService();
    }

    @Bean
    public TaskService taskService() throws Exception {
        return processEngine().getObject().getTaskService();
    }

    @Bean
    public HistoryService historyService() throws Exception {
        return processEngine().getObject().getHistoryService();
    }
}

使用Starter

依賴
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring-boot-starter</artifactId>
        <version>7.1.0.M3.1</version>
    </dependency>

需要注意的是,這里的依賴版本,需要對應數據庫中act_ge_property表中schema.version版本信息,所以一般不建議在創建完表之后修改依賴信息

application.propertie
spring.activiti.database-schema-update=true
spring.activiti.process-definition-location-prefix=classpath:/process/
# 這里還是記得注意最后面添加url時添加的語句

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&nullCatalogMeansCurrent=true
spring.datasource.username=root
spring.datasource.password=root

從BPMN文件讀取一個工作流

    @Autowired
    RepositoryService repositoryService;

    @Autowired
    TaskService taskService;
    
    @Test
    public void deploy() {
        //獲取倉庫服務 :管理流程定義
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deploy = repositoryService.createDeployment()//創建一個部署的構建器
                .addClasspathResource("XXXXXXXX/LeaveActiviti.bpmn")//從類路徑中添加資源,一次只能添加一個資源
                .name("請求單流程")//設置部署的名稱
                .category("辦公類別")//設置部署的類別
                .deploy();

        System.out.println("部署的id"+deploy.getId());
        System.out.println("部署的名稱"+deploy.getName());
    }

運行一個工作流

    @Autowired
    RuntimeService runtimeService;
    
    /**
     * 運行一個工作流
     */
    @Test
    void startProcess() {
        //指定執行我們剛才部署的工作流程
        String processDefKey = "leave";
        //取運行時服務
        if (runtimeService != null) log.error("Engine Success");
        //取得流程實例
        ProcessInstance instance = runtimeService.startProcessInstanceById("PROCESS_1:1:7504");
        System.out.println("流程實例id:"+instance.getId());//流程實例id
        System.out.println("流程定義id:"+instance.getProcessDefinitionId());//輸出流程定義的id
    }
    
運行結果:
2021-01-14 09:57:45.303 ERROR 6882 --- [           main] com.codedef.ActivitiApplicationTests     : Engine Success
流程實例id:10001
流程定義id:PROCESS_1:1:7504

查詢所有待辦

/**
     * 查詢待辦
     */
    @Test
    void getTaskList() {
        List<Task> tasks = taskService.createTaskQuery().list();
        log.info("tasks len: " + tasks.size());
        tasks.stream().forEach(e -> {
            System.out.println(e);
        });
    }

運行結果:
2021-01-14 10:23:00.962  INFO 8496 --- [           main] com.codedef.ActivitiApplicationTests     : tasks len: 1
Task[id=15005, name=提交申請]

查詢某個人的待辦

/**
     * 根據代理人查詢當前任務的信息
     */
    @Test
    void getTaskByAssignee() {
        String assignee;
        List<Task> list;
        //創建一個任務查詢對象
        TaskQuery taskQuery = taskService.createTaskQuery();


        //任務的辦理人
        assignee = "老大";
        log.info("老大的任務:");
        list = taskQuery.taskAssignee(assignee).list();
        list.stream().forEach(e -> {
            System.out.println(e);
        });

        System.out.println("\n\n\n\n");

        //任務的辦理人
        assignee = "小張";
        log.info("小張的任務:");
        list = taskQuery.taskAssignee(assignee).list();
        list.stream().forEach(e -> {
            System.out.println(e);
        });

    }
    
運行結果:
com.codedef.ActivitiApplicationTests     : 小張的任務:
Task[id=15005, name=提交申請]

處理一個任務

    /**
     * 完成一個任務
     */
    @Test
    void compileTask() {
        String taskId="15005";
        //taskId:任務id
        taskService.complete(taskId);
        System.out.println("當前任務執行完畢");
    }

NOTICE: 執行完該Test后,ACT_RU_TASK表中的“小張:提交申請”的記錄消失,出現“老大:經理審批”記錄。
此時再次執行查詢任務的Test,小張的任務為空,老大的任務中出現一條記錄“Task[id=17502, name=經理審批]”。

多人會簽


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM