JDK21和 Flowable 7.0.0
一.Flowable
Java语言实现的轻量级工作流框架
二.项目搭建
项目结构
1.依赖包
本测试项目包含了 drools 、dmn 等依赖
<?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.example</groupId>
<artifactId>flowable-test</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>flowable</artifactId>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.boot.version>3.1.3</spring.boot.version>
<flowable.version>7.0.0</flowable.version>
<drools.version>9.44.0.Final</drools.version>
</properties>
<!-- drools-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-bom</artifactId>
<type>pom</type>
<scope>import</scope>
<version>${drools.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring.boot.version}</version>
</dependency>
<!-- flowable -->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>${flowable.version}</version>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter-actuator</artifactId>
<version>${flowable.version}</version>
</dependency>
<!-- camel-->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-camel</artifactId>
<version>${flowable.version}</version>
</dependency>
<!-- dmn-->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-dmn-engine</artifactId>
<version>${flowable.version}</version>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-dmn-engine-configurator</artifactId>
<version>${flowable.version}</version>
</dependency>
<!-- mq jms-->
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-jms-spring-executor</artifactId>
<version>${flowable.version}.M1</version>
<exclusions>
<exclusion>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>6.0.1</version>
</dependency>
<!-- httpclient flowable http-->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.14</version>
</dependency>
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
<version>4.0.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- pgsql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.6.0</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.44</version>
</dependency>
<!--java script execution-->
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>15.4</version>
</dependency>
<!-- drools-->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-engine</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-mvel</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-model-compiler</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-xml-support</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
2.数据库
Flowable 默认使用 H2 数据库,但是可以通过修改配置文件来指定,本文使用的是 Postgres
创建一个名为 flowable 的库
Flowable 首次启动时默认会自动创建表
也可以通过官方SQL脚本手动创建表
3.资源文件
1.YML配置文件
server:
port: 8086
servlet.context-path: /flowable-rest
## 暴露 SpringBoot 除 shutdown 外的所有端点
management:
server.port: 7291
endpoints:
web:
exposure:
include: "*"
health:
show-details: when_authorized
roles: access-admin
spring:
activemq:
broker-url: tcp://localhost:61616
application:
name: flowable-rest
banner:
location: classpath:/org/flowable/spring/boot/flowable-banner.txt
jmx:
default-domain: ${
spring.application.name}
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://127.0.0.1:5432/flowable
username: postgres
password: 123456
## 连接池
type: com.zaxxer.hikari.HikariDataSource
hikari:
poolName: ${
spring.application.name}
maxLifetime: 600000
idleTimeout: 300000
minimumIdle: 10
maximumPoolSize: 50
connection-test-query: select 1
## java object serializable
rest:
variables:
allow:
serializable=true:
flowable:
process-definition-location-prefix: classpath*:/processes/
process-definition-location-suffixes: "**.bpmn20.xml,**.bpmn,drools/**.drl,dmn/**.dmn.xml"
database-schema-update: true
async-executor-activate: true
history-level: full
rest:
app:
swagger-docs-enabled: true
create-demo-definitions: true
authentication-mode: verify-privilege
admin:
user-id: rest-admin
password: test
firstname: Rest
lastname: Admin
process:
servlet:
path: /service
mail.server:
default-from: xxxxxx@qq.com
host: smtp.qq.com
username: xxxxxx@qq.com
password: xxxxxx
s-s-l-port: 465
use-ssl: true
use-tls: false
logging:
level:
org.example.*: debug
2.Drools kbase
<?xml version="1.0" encoding="UTF-8"?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
<!--
name: kbase 名称全局唯一
packages: 规则文件包目录
default: 指定为默认 kbase
-->
<kbase name="my_kbase" packages="processes.drools.*" default="true">
<!--
name: ksession 名称 kbase 下唯一
default: 指定为默认 ksession
clockType: 时钟类型 系统时钟或测试的伪时钟
-->
<ksession name="my_ks" clockType="realtime" default="true"/>
</kbase>
</kmodule>
3.Drools rule
MyBusinessRule.drl
package drools
rule "myBusiness_1"
when
then
System.out.println("Step4_1 drools 9.44.0.Final");
end
rule "myBusiness_2"
when
then
System.out.println("Step4_2 drools 9.44.0.Final");
end
rule "myBusiness_3"
when
then
System.out.println("Step4_3 drools 9.44.0.Final");
end
4.DMN 决策表
MyDecision.dmn.xml
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/DMN/20180521/MODEL/"
id="simple" name="Simple" namespace="http://activiti.org/dmn">
<decision id="myDecision" name="Simple decision">
<decisionTable id="myDecisionTest" hitPolicy="UNIQUE">
<input id="inputId">
<inputExpression id="inputExpression1" typeRef="number">
<text>age</text>
</inputExpression>
</input>
<output id="outputId" label="myResult" name="myResult" typeRef="string" />
<rule>
<inputEntry id="inputEntry_1">
<text>>18</text>
</inputEntry>
<outputEntry id="outputEntry_1">
<text>'成年'</text>
</outputEntry>
</rule>
<rule>
<inputEntry id="inputEntry_2">
<text><=18</text>
</inputEntry>
<outputEntry id="outputEntry_2">
<text>'未成年'</text>
</outputEntry>
</rule>
</decisionTable>
</decision>
</definitions>
5.BPMN 流文件
leave_approval_process.bpmn20.xml
可通过下面 IDEA 插件查看流节点
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
<process id="leave_approval_process" name="leave_approval_process" isExecutable="true">