vlambda博客
学习文章列表

企业级开发flowable工作流平台SpringBoot+swagger+flowable+mybatis plus+mysql

yqmm-flowable

flowable-ui部署运行

官网下载flowable-6.6.0 : https://github.com/flowable/flowable-engine/releases/download/flowable-6.6.0/flowable-6.6.0.zip

将压缩包中的 flowable-6.6.0\wars\flowable-ui.war 丢到Tomcat中跑起来

打开http://localhost:8080/flowable-ui 用账户:admin/test 登录


在这里插入图片描述


进入APP.MODELER创建流程,之后可以导出流程到项目中使用,或者配置apache-tomcat-9.0.37\webapps\flowable-ui\WEB-INF\classes\flowable-default.properties连接本地数据库

向我这样配置即可:

server.port=8080server.servlet.context-path=/flowable-uispring.jmx.unique-names=true# This is needed to force use of JDK proxies instead of using CGLIBspring.aop.proxy-target-class=falsespring.aop.auto=falsespring.application.name=flowable-uispring.banner.location=classpath:/org/flowable/spring/boot/flowable-banner.txt# The default domain for generating ObjectNames must be specified. Otherwise when multiple Spring Boot applications start in the same servlet container# all would be created with the same name (com.zaxxer.hikari:name=dataSource,type=HikariDataSource) for examplespring.jmx.default-domain=${spring.application.name}## SECURITY#spring.security.filter.dispatcher-types=REQUEST,FORWARD,ASYNC
# Expose all actuator endpoints to the web# They are exposed, but only authenticated users can see /info and /health abd users with access-admin can see the othersmanagement.endpoints.web.exposure.include=*# Full health details should only be displayed when a user is authorizedmanagement.endpoint.health.show-details=when_authorized# Only users with role access-admin can access full health detailsmanagement.endpoint.health.roles=access-admin# Spring prefixes the roles with ROLE_. However, Flowable does not have that concept yet, so we need to override that with an empty stringflowable.common.app.role-prefix=
## SECURITY OAuth2# Examples are for Keycloak##spring.security.oauth2.resourceserver.jwt.issuer-uri=<keycloakLocation>/auth/realms/<realmName>#spring.security.oauth2.client.registration.keycloak.client-id=<clientId>#spring.security.oauth2.client.registration.keycloak.client-secret=<clientSecret>#spring.security.oauth2.client.registration.keycloak.client-name=Flowable UI Keycloak#spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code#spring.security.oauth2.client.provider.keycloak.issuer-uri=<keycloakLocation>/auth/realms/<realmName>#spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username
#flowable.common.app.security.type=oauth2#flowable.common.app.security.oauth2.authorities-attribute=groups#flowable.common.app.security.oauth2.groups-attribute=userGroups#flowable.common.app.security.oauth2.default-authorities=access-task#flowable.common.app.security.oauth2.default-groups=flowableUser#flowable.common.app.security.oauth2.full-name-attribute=name#flowable.common.app.security.oauth2.email-attribute=email
## DATABASE&nullCatalogMeansCurrent=true#
#spring.datasource.driver-class-name=org.h2.Driver#spring.datasource.url=jdbc:h2:~/flowable-db/engine-db;AUTO_SERVER=TRUE;AUTO_SERVER_PORT=9093;DB_CLOSE_DELAY=-1#重要spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver#重要spring.datasource.url=jdbc:mysql://127.0.0.1:3306/flowable?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
#spring.datasource.driver-class-name=org.postgresql.Driver#spring.datasource.url=jdbc:postgresql://localhost:5432/flowable
#spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver#spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=flowablea
#spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver#spring.datasource.url=jdbc:oracle:thin:@localhost:1521:FLOWABLE
#spring.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver#spring.datasource.url=jdbc:db2://localhost:50000/flowable#重要spring.datasource.username=rootspring.datasource.password=root
# JNDI CONFIG
# If uncommented, the datasource will be looked up using the configured JNDI name.# This will have preference over any datasource configuration done below that doesn't use JNDI## Eg for JBoss: java:jboss/datasources/flowableDS##spring.datasource.jndi-name==jdbc/flowableDS
# Set whether the lookup occurs in a J2EE container, i.e. if the prefix "java:comp/env/" needs to be added if the JNDI# name doesn't already contain it. Default is "true".#datasource.jndi.resourceRef=true
## Connection pool (see https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby)#
spring.datasource.hikari.poolName=${spring.application.name}# 10 minutesspring.datasource.hikari.maxLifetime=600000# 5 minutesspring.datasource.hikari.idleTimeout=300000spring.datasource.hikari.minimumIdle=10spring.datasource.hikari.maximumPoolSize=50# test query for H2, MySQL, PostgreSQL and Microsoft SQL Server#spring.datasource.hikari.connection-test-query=select 1# test query for Oracle#spring.datasource.hikari.connection-test-query=SELECT 1 FROM DUAL# test query for DB2#spring.datasource.hikari.connection-test-query=SELECT current date FROM sysibm.sysdummy1
## Default Task Executor (will be used for @Async)#spring.task.execution.pool.core-size=2spring.task.execution.pool.max-size=50spring.task.execution.pool.queue-capacity=10000spring.task.execution.thread-name-prefix=flowable-ui-task-Executor-
## Task scheduling#spring.task.scheduling.pool.size=5
## EMAIL#
#flowable.mail.server.host=localhost#flowable.mail.server.port=1025#flowable.mail.server.username=#flowable.mail.server.password=
## FLOWABLE#
flowable.process.definition-cache-limit=512#flowable.dmn.strict-mode=falseflowable.process.async.executor.default-async-job-acquire-wait-time-in-millis=5000flowable.process.async.executor.default-timer-job-acquire-wait-time-in-millis=5000
flowable.cmmn.async.executor.default-async-job-acquire-wait-time-in-millis=5000flowable.cmmn.async.executor.default-timer-job-acquire-wait-time-in-millis=5000
# The maximum file upload limit. Set to -1 to set to 'no limit'. Expressed in bytesspring.servlet.multipart.max-file-size=10MB# The maximum request size limit. Set to -1 to set to 'no limit'.# When multiple files can be uploaded this needs to be more than the 'max-file-size'.spring.servlet.multipart.max-request-size=10MB
# For development purposes, data folder is created inside the sources ./data folderflowable.content.storage.root-folder=data/flowable.content.storage.create-root=true
flowable.common.app.idm-admin.user=adminflowable.common.app.idm-admin.password=test
flowable.experimental.debugger.enabled=false
# Rest API in task application
# If false, disables the rest api in the task appflowable.task.app.rest-enabled=true
# Configures the way user credentials are verified when doing a REST API call:# 'any-user' : the user needs to exist and the password need to match. Any user is allowed to do the call (this is the pre 6.3.0 behavior)# 'verify-privilege' : the user needs to exist, the password needs to match and the user needs to have the 'rest-api' privilege# If nothing set, defaults to 'verify-privilege'flowable.rest.app.authentication-mode=verify-privilege
# Enable form field validation after form submission on the engine sideflowable.form-field-validation-enabled=false
# Flowable Admin Properties
# Passwords for rest endpoints and master configs are stored encrypted in the database using AES/CBC/PKCS5PADDING# It needs a 128-bit initialization vector (http://en.wikipedia.org/wiki/Initialization_vector)# and a 128-bit secret key represented as 16 ascii characters below## Do note that if these properties are changed after passwords have been saved, all existing passwords# will not be able to be decrypted and the password would need to be reset in the UI.flowable.admin.app.security.encryption.credentials-i-v-spec=j8kdO2hejA9lKmm6flowable.admin.app.security.encryption.credentials-secret-spec=9FGl73ngxcOoJvmL#flowable.admin.app.security.preemptive-basic-authentication=true
# Flowable IDM Properties
## LDAP##flowable.idm.ldap.enabled=true#flowable.idm.ldap.server=ldap://localhost#flowable.idm.ldap.port=10389#flowable.idm.ldap.user=uid=admin, ou=system#flowable.idm.ldap.password=secret#flowable.idm.ldap.base-dn=o=flowable#flowable.idm.ldap.query.user-by-id=(&(objectClass=inetOrgPerson)(uid={0}))#flowable.idm.ldap.query.user-by-full-name-like=(&(objectClass=inetOrgPerson)(|({0}=*{1}*)({2}=*{3}*)))#flowable.idm.ldap.query.all-users=(objectClass=inetOrgPerson)#flowable.idm.ldap.query.groups-for-user=(&(objectClass=groupOfUniqueNames)(uniqueMember={0}))#flowable.idm.ldap.query.all-groups=(objectClass=groupOfUniqueNames)#flowable.idm.ldap.query.group-by-id=(&(objectClass=groupOfUniqueNames)(uniqueId={0}))#flowable.idm.ldap.attribute.user-id=uid#flowable.idm.ldap.attribute.first-name=cn#flowable.idm.ldap.attribute.last-name=sn#flowable.idm.ldap.attribute.email=mail#flowable.idm.ldap.attribute.group-id=cn#flowable.idm.ldap.attribute.group-name=cn#flowable.idm.ldap.cache.group-size=10000#flowable.idm.ldap.cache.group-expiration=180000
## Keycloak##flowable.idm.app.keycloak.enabled=true#flowable.idm.app.keycloak.server=<keycloakLocation>#flowable.idm.app.keycloak.authentication-realm=master#flowable.idm.app.keycloak.authentication-user=admin#flowable.idm.app.keycloak.authentication-password=admin#flowable.idm.app.keycloak.realm=<realm>
## DEFAULT ADMINISTRATOR ACCOUNT#
flowable.idm.app.admin.user-id=adminflowable.idm.app.admin.password=testflowable.idm.app.admin.first-name=Testflowable.idm.app.admin.last-name=Administratorflowable.idm.app.admin.email=test-admin@example-domain.tld
# Enable and configure JMS#flowable.task.app.jms-enabled=true#spring.activemq.broker-url=tcp://localhost:61616
# Enable and configure RabbitMQ#flowable.task.app.rabbit-enabled=true#spring.rabbitmq.addresses=localhost:5672#spring.rabbitmq.username=guest#spring.rabbitmq.password=guest
# Enable and configure Kafka#flowable.task.app.kafka-enabled=true#spring.kafka.bootstrap-servers=localhost:9092

注意:

需要将java驱动jar(mysql-connector-java-XXX.jar)复制到 apache-tomcat-9.0.37\webapps\flowable-rest\WEB-INF\lib

mysql 8.X 记得替换当前版本

流程图说明:

1.事件(event) 通常用于为流程生命周期中发生的事情建模,图里是【开始、结束】两个圈。2.顺序流(sequence flow) 是流程中两个元素间的连接器。图里是【箭头线段】。3.网关(gateway) 用于控制执行的流向。图里是【菱形(中间有X)】4.用户任务(user task) 用于对需要人工执行的任务进行建模。图里是【矩形】。

流程表说明:

1、Flowable的所有数据库表都以ACT_开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。


2、ACT_RE_: 'RE’代表repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。

3、ACT_RU_: 'RU’代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。

4、ACT_HI_: 'HI’代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。

5、ACT_GE_: 通用数据。在多处使用。

通用数据表:

act_ge_bytearray:二进制数据表,如流程定义、流程模板、流程图的字节流文件;act_ge_property:属性数据表(不常用);

历史表

1.act_hi_actinst:历史节点表,存放流程实例运转的各个节点信息(包含开始、结束等非任务节点);2.act_hi_attachment:历史附件表,存放历史节点上传的附件信息(不常用);3.act_hi_comment:历史意见表;4.act_hi_detail:历史详情表,存储节点运转的一些信息(不常用);5.act_hi_identitylink:历史流程人员表,存储流程各节点候选、办理人员信息,常用于查询某人或部门的已办任务;6.act_hi_procinst:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例);7.act_hi_taskinst:历史流程任务表,存储历史任务节点;8.act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息;流程定义表:9.act_re_deployment:部属信息表,存储流程定义、模板部署信息;10.act_re_procdef:流程定义信息表,存储流程定义相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;11.act_re_model:流程模板信息表,存储流程模板相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;

流程运行时表(6个,RuntimeService接口操作的表)

12.act_ru_task:运行时流程任务节点表,存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用;13.act_ru_event_subscr:监听信息表,不常用;14.act_ru_execution:运行时流程执行实例表,记录运行中流程运行的各个分支信息(当没有子流程时,其数据与act_ru_task表数据是一一对应的);15.act_ru_identitylink:运行时流程人员表,重要,常用于查询人员或部门的待办任务时使用;16.act_ru_job:运行时定时任务数据表,存储流程的定时任务信息;17.act_ru_variable:运行时流程变量数据表,存储运行中的流程各节点的变量信息;

用户表

18.act_id_group:用户组信息表,对应节点选定候选组信息; 19.act_id_info:用户扩展信息表,存储用户扩展信息; 20.act_id_membership:用户与用户组关系表; 21.act_id_user:用户信息表,对应节点选定办理人或候选人信息;



流程引擎API与服务

1、RepositoryService很可能是使用Flowable引擎要用的第一个服务。这个服务提供了管理与控制部署(deployments)与流程定义(process definitions)的操作。管理静态信息,

2、RuntimeService用于启动流程定义的新流程实例。

3、IdentityService很简单。它用于管理(创建,更新,删除,查询……)组与用户。

4、FormService是可选服务。也就是说Flowable没有它也能很好地运行,而不必牺牲任何功能。

5、HistoryService暴露Flowable引擎收集的所有历史数据。要提供查询历史数据的能力。

6、ManagementService通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业(job)的查询与管理操作。

7、DynamicBpmnService可用于修改流程定义中的部分内容,而不需要重新部署它。例如可以修改流程定义中一个用户任务的办理人设置,或者修改一个服务任务中的类名。

代码结构

在这里插入图片描述

swagger 路径:http://localhost:8089/doc.html

在这里插入图片描述

帮助文档

[1] 视频讲解: https://www.bilibili.com/video/BV1nT4y1C7mL?share_source=copy_web
[2] 返回task报错问:题: https://blog.csdn.net/haobindayi/article/details/120842361
[3] 集成swagger文档: https://www.jianshu.com/p/5cf2e031dff1
[4] json map传参分:析: https://www.cnblogs.com/helloluya/p/14928118.html