spring boot整合flowable(分库)

资源地址

github : https://github.com/flowable/flowable-engine

flowable是什么

flowable是流程管理开源解决方案,从Activiti中分离出来的;由原 Activiti 的核心开发团队创建,旨在提供一个更加轻量级、更专注于核心业务流程管理的解决方案。flowable仅仅关注流程怎么走,不关心流程状态变化,更像一个代码编排工具,数据的可见性,状态流转,操作权限等还是由业务实现。

整合

由于flowable自己的表有70多张,不适合与业务使用同一个库,这里使用分库部署

  • pom.xml
<projectxmlns="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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.suozq</groupId><artifactId>workflow</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</version><relativePath/><!-- lookup parent from repository --></parent><properties><java.version>8</java.version><flowable.version>6.8.1</flowable.version><!-- 可选:锁定 MySQL 驱动版本 --><mysql.version>8.0.33</mysql.version></properties><dependencies><!-- Web 支持 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Flowable --><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>${flowable.version}</version></dependency><!-- MySQL 驱动 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- (可选)Actuator 监控 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- (可选)Lombok 简化代码 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- 测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
  • application.yml
spring:datasource:url: jdbc:mysql://localhost:3306/biz_db?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=trueusername: root password: root driver-class-name: com.mysql.cj.jdbc.Driver flowable:database-schema-update:truedatasource:jdbc-url: jdbc:mysql://localhost:3306/flowable_db?useSSL=false&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver activity-font-name:"宋体"annotation-font-name:"宋体"label-font-name:"宋体"
database-schema-update :true : 启动时检测是否有flowable相关表,没有创建,有就校验;false: 启动时不创建表,生产环境;create-drop:启动时创建,关闭时删除,测试环境;drop-create:启动时先删除再创建,测试环境;
  • FlowableConfig.java
packagecom.suozq.workflow.config;importjavax.sql.DataSource;importorg.flowable.app.spring.SpringAppEngineConfiguration;importorg.flowable.spring.boot.EngineConfigurationConfigurer;importorg.flowable.spring.boot.ProcessEngineAutoConfiguration;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.boot.autoconfigure.condition.ConditionalOnProperty;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Import;importorg.springframework.jdbc.datasource.DataSourceTransactionManager;importorg.springframework.lang.NonNull;importorg.springframework.transaction.PlatformTransactionManager;importcom.zaxxer.hikari.HikariDataSource;@ConfigurationpublicclassFlowableConfigimplementsEngineConfigurationConfigurer<SpringAppEngineConfiguration>{@Bean@ConfigurationProperties(prefix ="flowable.datasource")@NonNullpublicDataSourceflowableDataSource(){DataSource dataSource =newHikariDataSource();return dataSource;}/** * 配置Flowable专用事务管理器 * * @param flowableDataSource Flowable数据源 * @return Flowable事务管理器 */@BeanpublicPlatformTransactionManagerflowableTransactionManager(){returnnewDataSourceTransactionManager(flowableDataSource());}@Overridepublicvoidconfigure(SpringAppEngineConfiguration engineConfiguration){ engineConfiguration.setDataSource(flowableDataSource()); engineConfiguration.setTransactionManager(flowableTransactionManager());}}
  • FlowableServiceExample.java
@ServicepublicclassFlowableServiceExample{@AutowiredprivateRepositoryService repositoryService;// 流程定义管理@AutowiredprivateRuntimeService runtimeService;// 运行时流程实例@AutowiredprivateTaskService taskService;// 任务管理@AutowiredprivateHistoryService historyService;// 历史数据@AutowiredprivateManagementService managementService;// 引擎管理@AutowiredprivateDynamicBpmnService dynamicBpmnService;// 动态修改// 1. 部署流程定义publicDeploymentdeployProcess(){return repositoryService.createDeployment().addClasspathResource("processes/leave.bpmn20.xml").name("请假流程").deploy();}// 2. 启动流程实例publicProcessInstancestartProcess(String processKey,Map<String,Object> variables){return runtimeService.startProcessInstanceByKey( processKey, variables);}// 3. 查询publicList<Task>getUserTasks(String userId){return taskService.createTaskQuery().taskAssignee(userId).active().list();}//完成任务publicvoidcompleteTask(String taskId,Map<String,Object> variables){ taskService.complete(taskId, variables);}// 4. 历史数据查询publicList<HistoricProcessInstance>getProcessHistory(){return historyService.createHistoricProcessInstanceQuery().finished().orderByProcessInstanceEndTime().desc().list();}}

前端

从github下载整个压缩包后,里面有flowable-ui.war, 在同级目录下,添加application.properties配置文件,配置数据库为上面的flowable_db,

server.port=8081 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/flowable_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=root spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver flowable.database-schema-update=false
在这里插入图片描述

使用java -jar flowable-ui.war 命令启动,即可通过页面配置流程;配置好后,创建应用,关联流程,发布,即可在程序中使用该流程了;

坑点

  1. 启动报错no flowable tables in dbTable 'xxxx.act_ge_property' doesn't exist
这种情况多主要原因就是flowable判断表是否存在的语句有漏洞,没有明确指定库名!相同物理库下,一旦也有flowable的表,就会认为表已经创建!

解决方案(仅限MySQL): 数据库url 添加参数&nullCatalogMeansCurrent=true
该参数代表如果不指定库名,则自动使用当前库名

flowable-ui 官方包中没有mysql驱动

这真挺坑的,没有mysql驱动,打个包放这儿干啥?直接往里放驱动,还会因为压缩程序问题,导致整个包都不能用! 反正我尝试了很多方式,都没有成功把驱动加入,要么就是配置外置包,要么就通过源码编译,我这里使用源码编译
flowable-ui.war
账密:admin/test

Read more

MySQL 总结|MySQL 从入门到高级

MySQL 总结|MySQL 从入门到高级

摘要:本文全面系统地讲解了 MySQL 从基础操作到高级特性的核心知识,内容涵盖数据库基础概念、SQL 核心语法、索引与性能优化、事务与锁机制、InnoDB 引擎原理、主从复制等关键技术。 1. MySQL 概述 1.1 数据库相关概念 本部分将讲解三个核心概念:数据库、数据库管理系统、SQL。 名称全称简称数据库存储数据的仓库,数据是有组织的进行存储DataBase数据库管理系统操纵和管理数据库的大型软件DataBase Management System SQL操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准Structured Query Language  2. SQL语句 全称 Structured Query Language(结构化查询语言),是操作关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准。无论使用 Oracle、SQL Server 还是 MySQL 等关系型数据库,均可以通过 SQL 语言进行统一操作,因此掌握

By Ne0inhk
Spring 事务和事务传播机制

Spring 事务和事务传播机制

1. 事务的回顾 在 MySQL 学习阶段,已经了解到了事务是一组操作的集合,也就是把所有的操作作为一个整体,一起向数据库提交或者撤销操作,要么同时成功,要么同时失败 一个事务的操作流程包括了,开启事务,执行事务操作,提交事务或回滚事务,对于回滚事务来说,如果程序在执行过程中出现了错误,那么此时就需要执行回滚事务 2. 事务的实现方式 2.1. 编程式事务 Spring 手动操作事务和 MySQL 操作事务类似,也是分为开启事务,提交事务,回滚事务等三个操作,需要用到 DataSourceTransactionManager (事务管理器)来进行上述事务的操作,还需要用到 TransactionDefinition(事务的属性,获取事务时需要把这个类的对象传进去) @RestController @RequestMapping("/user") public class UserController { @Autowired private UserService userService; @Autowired

By Ne0inhk
必收藏!小白也能懂:Agent、Skills、MCP和A2A大模型架构完全指南

必收藏!小白也能懂:Agent、Skills、MCP和A2A大模型架构完全指南

文章详解AI Agent四大核心概念:Agent作为智能决策主体,Skills提供原子化能力封装,MCP实现标准化工具调用,A2A支持Agent间协作。这些技术共同构建了从单Agent自主执行到多Agent协同工作的完整技术栈,解决了智能体的自主性、模块化能力、工具调用和互操作等核心问题,助力开发者快速构建专业级AI应用。 一、Agent、Skills、MCP和A2A的核心概念总览 1、Agent (代理/智能体):自主决策与执行的“大脑”。 AI Agent是2026年AI生态的核心概念,是基于人工智能技术构建的、具备感知环境、理解信息、自主推理决策、自主规划与执行动作并持续与环境/其他主体交互,以自主达成预设或动态生成目标的数字智能实体。2026年的智能体不是在回答问题,而是在完成任务。其突破了传统问答式、生成式AI的能力边界,可像人类员工一样独立处理复杂综合性任务。它以大模型为核心引擎,整合规划、记忆、工具调用与行动执行四大能力,形成「感知 - 认知 - 决策 - 执行 - 反馈」的完整智能闭环,

By Ne0inhk
别再手动调优了!KingbaseES连接条件下推自动拯救慢 SQL

别再手动调优了!KingbaseES连接条件下推自动拯救慢 SQL

告别SQL性能焦虑:金仓数据库“连接条件下推”的性能魔法 你是否遇到过这样的场景:一个看似复杂的SQL,在测试环境运行飞快,一到生产环境就“卡死”,一查执行计划,发现子查询生成了一个巨大的中间结果集,导致后续操作全部陷入性能泥潭? 如果你正被此类场景困扰,那么,是时候认识一项改变游戏规则的技术:金仓数据库(KingbaseES)「基于代价的连接条件下推」。它不仅是技术优化,更是应对复杂业务查询的“性能终结者”。 一、 为什么你的复杂SQL会“爆内存”? 在金融、政务等复杂业务系统中,为了逻辑清晰,SQL常常被写成这样: SELECT * FROM (SELECT DISTINCT * FROM 巨表_A) AS 子查询结果, 筛选表_B WHERE 子查询结果.关键ID = 筛选表_B.关键ID AND 筛选表_B.过滤字段 = '

By Ne0inhk