From f6fbdb67918b5600043aa8a3f333151cbf5f1e72 Mon Sep 17 00:00:00 2001 From: lijinghao Date: Mon, 20 Feb 2023 16:34:05 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BC=98=E5=8C=96maven=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E7=AE=A1=E7=90=86=20-=20=E7=A7=BB=E9=99=A4httpclient?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=20-=20=E7=A7=BB=E9=99=A4=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E7=9A=84jsr250-api=E4=BE=9D=E8=B5=96=20-=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=8D=95=E7=8B=AC=E7=9A=84junit=E4=BE=9D=E8=B5=96=20-=20common?= =?UTF-8?q?s-collections=203.2.2=20-->=20commons-collections4=20-=20common?= =?UTF-8?q?s-lang3=203.4=20-->=203.12.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2、优化钩子功能,http模式改为内部调用模式,减少对Http包的依赖,提高性能 3、简化Turbo引入配置步骤,添加@EnableTurboEngine注解 4、优化部分代码结构 5、优化Demo Test执行 --- README.md | 3 - demo/pom.xml | 31 +++- .../turbo/demo/DemoApplication.java | 12 +- .../demo/service/AfterSaleServiceImpl.java | 3 +- .../turbo/demo/service/HookServiceImpl.java | 23 +++ .../turbo/demo/util/EntityBuilder.java | 2 +- .../src/main/resources/application.properties | 2 - .../com/didiglobal/turbo/demo/DemoTest.java | 1 - .../turbo/demo/FlowControllerTest.java | 11 +- .../src/test/resources/application.properties | 22 +++ demo/src/test/resources/logback-spring.xml | 35 ++++ .../resources/script/turbo-mysql-h2-ddl.sql | 122 +++++++++++++ .../resources/script/turbo-mysql-h2-dml.sql | 7 + engine/pom.xml | 45 ++--- .../engine/annotation/EnableTurboEngine.java | 21 +++ .../turbo/engine/config/HookProperties.java | 36 ---- .../engine/config/TurboEngineConfig.java | 15 ++ .../turbo/engine/dao/FlowDefinitionDAO.java | 4 +- .../turbo/engine/dao/FlowDeploymentDAO.java | 4 +- .../turbo/engine/dao/InstanceDataDAO.java | 4 +- .../turbo/engine/dao/NodeInstanceDAO.java | 6 +- .../turbo/engine/dao/NodeInstanceLogDAO.java | 4 +- .../turbo/engine/dao/ProcessInstanceDAO.java | 4 +- .../engine/executor/ElementExecutor.java | 4 + .../engine/executor/EndEventExecutor.java | 4 + .../executor/ExclusiveGatewayExecutor.java | 134 +++++++------- .../turbo/engine/executor/FlowExecutor.java | 8 +- .../engine/executor/RuntimeExecutor.java | 8 +- .../engine/executor/StartEventExecutor.java | 4 + .../engine/executor/UserTaskExecutor.java | 4 + .../engine/processor/RuntimeProcessor.java | 12 +- .../turbo/engine/spi/HookService.java | 27 +++ .../engine/util/ExpressionCalculator.java | 8 + .../turbo/engine/util/FlowModelUtil.java | 10 +- .../turbo/engine/util/HttpUtil.java | 72 -------- .../turbo/engine/util/InstanceDataUtil.java | 10 +- .../engine/validator/ElementValidator.java | 2 +- .../engine/validator/EndEventValidator.java | 2 +- .../validator/ExclusiveGatewayValidator.java | 2 +- .../engine/validator/FlowModelValidator.java | 2 +- .../engine/validator/ModelValidator.java | 2 +- .../engine/validator/StartEventValidator.java | 2 +- pom.xml | 168 +++++++++--------- 43 files changed, 537 insertions(+), 365 deletions(-) create mode 100644 demo/src/main/java/com/didiglobal/turbo/demo/service/HookServiceImpl.java rename demo/src/{main => }/test/java/com/didiglobal/turbo/demo/DemoTest.java (94%) rename demo/src/{main => }/test/java/com/didiglobal/turbo/demo/FlowControllerTest.java (97%) create mode 100644 demo/src/test/resources/application.properties create mode 100644 demo/src/test/resources/logback-spring.xml create mode 100644 demo/src/test/resources/script/turbo-mysql-h2-ddl.sql create mode 100644 demo/src/test/resources/script/turbo-mysql-h2-dml.sql create mode 100644 engine/src/main/java/com/didiglobal/turbo/engine/annotation/EnableTurboEngine.java delete mode 100644 engine/src/main/java/com/didiglobal/turbo/engine/config/HookProperties.java create mode 100644 engine/src/main/java/com/didiglobal/turbo/engine/config/TurboEngineConfig.java create mode 100644 engine/src/main/java/com/didiglobal/turbo/engine/spi/HookService.java delete mode 100644 engine/src/main/java/com/didiglobal/turbo/engine/util/HttpUtil.java diff --git a/README.md b/README.md index 74234a66..77f6a55a 100644 --- a/README.md +++ b/README.md @@ -211,9 +211,6 @@ spring.datasource.dynamic.datasource.engine.password=password spring.datasource.dynamic.datasource.engine.driver-class-name=com.mysql.jdbc.Driver spring.datasource.dynamic.datasource.engine.url=jdbc:mysql://127.0.0.1:3306/db_engine -# 非必要属性 -hook.url=http://127.0.0.1:8031/data/refresh -hook.timeout=3000 ``` ## 4. 根据demo开始你的Turbo之旅吧 diff --git a/demo/pom.xml b/demo/pom.xml index 6b084482..80424b4b 100644 --- a/demo/pom.xml +++ b/demo/pom.xml @@ -6,31 +6,46 @@ com.didiglobal.turbo turbo - 1.0.1 + 1.0.2-SNAPSHOT 4.0.0 demo - 1.0.1 + 1.0.2-SNAPSHOT jar + + UTF-8 + 1.8 + + 1.5.10.RELEASE + 1.0.2-SNAPSHOT + 1.4.200 + + org.springframework.boot spring-boot-starter-web - 1.5.10.RELEASE + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test com.didiglobal.turbo engine - 1.0.1 + ${turbo.engine.version} - org.junit.jupiter - junit-jupiter - RELEASE - compile + com.h2database + h2 + 1.4.200 + test diff --git a/demo/src/main/java/com/didiglobal/turbo/demo/DemoApplication.java b/demo/src/main/java/com/didiglobal/turbo/demo/DemoApplication.java index 1dcce6c8..a929cc66 100644 --- a/demo/src/main/java/com/didiglobal/turbo/demo/DemoApplication.java +++ b/demo/src/main/java/com/didiglobal/turbo/demo/DemoApplication.java @@ -1,22 +1,16 @@ package com.didiglobal.turbo.demo; -import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; -import org.mybatis.spring.annotation.MapperScan; +import com.didiglobal.turbo.engine.annotation.EnableTurboEngine; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -@SpringBootApplication -@EnableAutoConfiguration(exclude = {DruidDataSourceAutoConfigure.class}) -@ComponentScan(basePackages = {"com.didiglobal.turbo.engine", "com.didiglobal.turbo.demo"}) -@MapperScan(basePackages = {"com.didiglobal.turbo.engine.dao"}) +@EnableTurboEngine +@SpringBootApplication(scanBasePackages = {"com.didiglobal.turbo.demo"}) public class DemoApplication { - private static final Logger LOGGER = LoggerFactory.getLogger(DemoApplication.class); public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); diff --git a/demo/src/main/java/com/didiglobal/turbo/demo/service/AfterSaleServiceImpl.java b/demo/src/main/java/com/didiglobal/turbo/demo/service/AfterSaleServiceImpl.java index 5915c300..784bf3bf 100644 --- a/demo/src/main/java/com/didiglobal/turbo/demo/service/AfterSaleServiceImpl.java +++ b/demo/src/main/java/com/didiglobal/turbo/demo/service/AfterSaleServiceImpl.java @@ -41,7 +41,8 @@ */ @Service public class AfterSaleServiceImpl { - private static final Logger LOGGER = LoggerFactory.getLogger(LeaveServiceImpl.class); + + private static final Logger LOGGER = LoggerFactory.getLogger(AfterSaleServiceImpl.class); @Resource private ProcessEngine processEngine; diff --git a/demo/src/main/java/com/didiglobal/turbo/demo/service/HookServiceImpl.java b/demo/src/main/java/com/didiglobal/turbo/demo/service/HookServiceImpl.java new file mode 100644 index 00000000..06988eef --- /dev/null +++ b/demo/src/main/java/com/didiglobal/turbo/demo/service/HookServiceImpl.java @@ -0,0 +1,23 @@ +package com.didiglobal.turbo.demo.service; + +import com.didiglobal.turbo.engine.model.InstanceData; +import com.didiglobal.turbo.engine.spi.HookService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class HookServiceImpl implements HookService { + private static final Logger LOGGER = LoggerFactory.getLogger(HookServiceImpl.class); + + @Override + public List invoke(String flowInstanceId, String nodeInstanceId, String nodeKey, String hookInfoParam) { + LOGGER.info("flowInstance={}||nodeInstanceId={}||nodeKey={}||hookInfoParam={}", + flowInstanceId, nodeInstanceId, nodeKey, hookInfoParam); + // do sth , eg: refresh info + return new ArrayList<>(); + } +} diff --git a/demo/src/main/java/com/didiglobal/turbo/demo/util/EntityBuilder.java b/demo/src/main/java/com/didiglobal/turbo/demo/util/EntityBuilder.java index f7e98964..f2fa2ae4 100644 --- a/demo/src/main/java/com/didiglobal/turbo/demo/util/EntityBuilder.java +++ b/demo/src/main/java/com/didiglobal/turbo/demo/util/EntityBuilder.java @@ -80,7 +80,7 @@ private static Object buildAfterSaleFlowModelEntity() { egOutgoings.add("SequenceFlow_168uou4"); exclusiveGateway.setOutgoing(egOutgoings); Map properties = new HashMap<>(); - properties.put("hookInfoIds", ""); + properties.put("hookInfoIds", "testInfo"); exclusiveGateway.setProperties(properties); flowElementList.add(exclusiveGateway); diff --git a/demo/src/main/resources/application.properties b/demo/src/main/resources/application.properties index 10264b1b..cf7dc2da 100644 --- a/demo/src/main/resources/application.properties +++ b/demo/src/main/resources/application.properties @@ -9,5 +9,3 @@ mybatis.configuration.map-underscore-to-camel-case=true logging.config=classpath:logback-spring.xml -hook.url=http://127.0.0.1:8031/globalInfo/refresh -hook.timeout=3000 diff --git a/demo/src/main/test/java/com/didiglobal/turbo/demo/DemoTest.java b/demo/src/test/java/com/didiglobal/turbo/demo/DemoTest.java similarity index 94% rename from demo/src/main/test/java/com/didiglobal/turbo/demo/DemoTest.java rename to demo/src/test/java/com/didiglobal/turbo/demo/DemoTest.java index f33ca4b2..240e2336 100644 --- a/demo/src/main/test/java/com/didiglobal/turbo/demo/DemoTest.java +++ b/demo/src/test/java/com/didiglobal/turbo/demo/DemoTest.java @@ -1,6 +1,5 @@ package com.didiglobal.turbo.demo; -import com.didiglobal.turbo.demo.DemoApplication; import com.didiglobal.turbo.demo.service.AfterSaleServiceImpl; import com.didiglobal.turbo.demo.service.LeaveServiceImpl; import org.junit.Test; diff --git a/demo/src/main/test/java/com/didiglobal/turbo/demo/FlowControllerTest.java b/demo/src/test/java/com/didiglobal/turbo/demo/FlowControllerTest.java similarity index 97% rename from demo/src/main/test/java/com/didiglobal/turbo/demo/FlowControllerTest.java rename to demo/src/test/java/com/didiglobal/turbo/demo/FlowControllerTest.java index 257b9490..e120ed38 100644 --- a/demo/src/main/test/java/com/didiglobal/turbo/demo/FlowControllerTest.java +++ b/demo/src/test/java/com/didiglobal/turbo/demo/FlowControllerTest.java @@ -34,9 +34,9 @@ public class FlowControllerTest { @Resource private FlowController flowController; - private String flowModuleId = null; + private String flowModuleId = "e7f6a27e-7cc3-11ec-b11c-02420abe030c"; - private String flowDeployId = null; + private String flowDeployId = "450a101f-ae74-11ed-a29f-42f50c2c0006"; /** * 创建流程接口 @@ -64,6 +64,7 @@ public void createFlow() { @Test public void saveFlowModel() { String flowModel = "{\"flowElementList\":[{\"incoming\":[],\"outgoing\":[\"Flow_3599vu7\"],\"dockers\":[],\"type\":2,\"properties\":{\"name\":\"开始\",\"x\":310,\"y\":200,\"text\":{\"x\":310,\"y\":240,\"value\":\"开始\"}},\"key\":\"Event_0vbtunu\"},{\"incoming\":[\"Flow_3599vu7\"],\"outgoing\":[\"Flow_1f2ei89\"],\"dockers\":[],\"type\":4,\"properties\":{\"name\":\"\",\"x\":520,\"y\":200,\"text\":\"\"},\"key\":\"Activity_0ivtksn\"},{\"incoming\":[\"Flow_1f2ei89\"],\"outgoing\":[\"Flow_1rkk099\"],\"dockers\":[],\"type\":6,\"properties\":{\"name\":\"\",\"x\":730,\"y\":200,\"text\":\"\"},\"key\":\"Gateway_2qj55i1\"},{\"incoming\":[\"Flow_1rkk099\"],\"outgoing\":[],\"dockers\":[],\"type\":3,\"properties\":{\"name\":\"结束\",\"x\":950,\"y\":200,\"text\":{\"x\":950,\"y\":240,\"value\":\"结束\"}},\"key\":\"Event_03pjf39\"},{\"incoming\":[\"Event_0vbtunu\"],\"outgoing\":[\"Activity_0ivtksn\"],\"type\":1,\"dockers\":[],\"properties\":{\"name\":\"\",\"text\":\"\",\"startPoint\":\"{\\\"x\\\":328,\\\"y\\\":200}\",\"endPoint\":\"{\\\"x\\\":470,\\\"y\\\":200}\",\"pointsList\":\"\\\"\\\"\"},\"key\":\"Flow_3599vu7\"},{\"incoming\":[\"Activity_0ivtksn\"],\"outgoing\":[\"Gateway_2qj55i1\"],\"type\":1,\"dockers\":[],\"properties\":{\"name\":\"\",\"text\":\"\",\"startPoint\":\"{\\\"x\\\":570,\\\"y\\\":200}\",\"endPoint\":\"{\\\"x\\\":705,\\\"y\\\":200}\",\"pointsList\":\"\\\"\\\"\"},\"key\":\"Flow_1f2ei89\"},{\"incoming\":[\"Gateway_2qj55i1\"],\"outgoing\":[\"Event_03pjf39\"],\"type\":1,\"dockers\":[],\"properties\":{\"conditionsequenceflow\":\"a==1\",\"name\":\"\",\"text\":\"\",\"startPoint\":\"{\\\"x\\\":755,\\\"y\\\":200}\",\"endPoint\":\"{\\\"x\\\":932,\\\"y\\\":200}\",\"pointsList\":\"\\\"\\\"\"},\"key\":\"Flow_1rkk099\"}]}"; + System.out.println(flowModel); UpdateFlowRequest updateFlowRequest = new UpdateFlowRequest(); updateFlowRequest.setFlowModuleId(flowModuleId); //模型唯一标识 必需 (使用createFlow中返回的flowModuleId) updateFlowRequest.setFlowModel(flowModel);//模型内容 必需 @@ -74,11 +75,9 @@ public void saveFlowModel() { updateFlowRequest.setRemark("备注test");//备注 非必需 updateFlowRequest.setOperator("testOperator");// 操作人 非必需 BaseResponse res = flowController.saveFlowModel(updateFlowRequest); - Assert.assertTrue(res.getErrCode() == 1000); //1000 成功 - + Assert.assertEquals(1000, res.getErrCode()); //1000 成功 } - /** * 发布流程接口 */ @@ -142,7 +141,5 @@ public void queryFlowList() { String str = "queryFlowList 处理成功 总条数:%s 当前页:%s 每页条数:%s"; str = String.format(str, res.getData().getTotal(), res.getData().getCurrent(), res.getData().getSize()); System.out.println(str); - } - } diff --git a/demo/src/test/resources/application.properties b/demo/src/test/resources/application.properties new file mode 100644 index 00000000..5da0c6bf --- /dev/null +++ b/demo/src/test/resources/application.properties @@ -0,0 +1,22 @@ +# ????? +spring.datasource.url=jdbc:h2:mem:test +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=root +spring.datasource.password= + +spring.datasource.dynamic.primary=engine +spring.datasource.dynamic.datasource.engine.type=com.alibaba.druid.pool.DruidDataSource +spring.datasource.dynamic.datasource.engine.username=username +spring.datasource.dynamic.datasource.engine.password=password +spring.datasource.dynamic.datasource.engine.driver-class-name=org.h2.Driver +spring.datasource.dynamic.datasource.engine.url=jdbc:h2:mem:t_engine;MODE=MYSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE + + +# DDL?? +spring.datasource.schema=classpath:script/turbo-mysql-h2-ddl.sql + +# DML?? +spring.datasource.data=classpath:script/turbo-mysql-h2-dml.sql + +logging.config=classpath:logback-spring.xml + diff --git a/demo/src/test/resources/logback-spring.xml b/demo/src/test/resources/logback-spring.xml new file mode 100644 index 00000000..18d40840 --- /dev/null +++ b/demo/src/test/resources/logback-spring.xml @@ -0,0 +1,35 @@ + + + + + + + + + + [%level][%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}][%logger:%L][%thread]||traceid=%X{X-B3-TraceId:-}||%msg%n + + + + + + + ${LOG_HOME}/turbo.demo.log.%d{yyyyMMddHH} + + 240 + + + + + [%level][%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ}][%logger:%L][%thread]||traceid=%X{X-B3-TraceId:-}||%msg%n + + UTF-8 + + + + + + + + + \ No newline at end of file diff --git a/demo/src/test/resources/script/turbo-mysql-h2-ddl.sql b/demo/src/test/resources/script/turbo-mysql-h2-ddl.sql new file mode 100644 index 00000000..f918529f --- /dev/null +++ b/demo/src/test/resources/script/turbo-mysql-h2-ddl.sql @@ -0,0 +1,122 @@ +CREATE SCHEMA IF NOT EXISTS turbo; + +DROP TABLE IF EXISTS `em_flow_definition`; +CREATE TABLE IF NOT EXISTS `em_flow_definition` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `flow_module_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程模型id', + `flow_name` varchar(64) NOT NULL DEFAULT '' COMMENT '流程名称', + `flow_key` varchar(32) NOT NULL DEFAULT '' COMMENT '流程业务标识', + `tenant_id` varchar(16) NOT NULL DEFAULT '' COMMENT '业务方标识', + `flow_model` mediumtext COMMENT '表单定义', + `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(1.初始态 2.编辑中 3.已下线)', + `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '流程创建时间', + `modify_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '流程修改时间', + `operator` varchar(32) NOT NULL DEFAULT '' COMMENT '操作人', + `remark` varchar(512) NOT NULL DEFAULT '' COMMENT '备注', + `archive` tinyint(4) NOT NULL DEFAULT '0' COMMENT '归档状态(0未删除,1删除)', + `tenant` varchar(100) NOT NULL DEFAULT '' COMMENT '租户', + `caller` varchar(100) NOT NULL DEFAULT '' COMMENT '调用方', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_flow_module_id` (`flow_module_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='流程定义表'; + +DROP TABLE IF EXISTS `em_flow_deployment`; +CREATE TABLE IF NOT EXISTS `em_flow_deployment` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `flow_deploy_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程模型部署id', + `flow_module_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程模型id', + `flow_name` varchar(64) NOT NULL DEFAULT '' COMMENT '流程名称', + `flow_key` varchar(32) NOT NULL DEFAULT '' COMMENT '流程业务标识', + `tenant_id` varchar(16) NOT NULL DEFAULT '' COMMENT '业务方标识', + `flow_model` mediumtext COMMENT '表单定义', + `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(1.已部署 3.已下线)', + `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '流程创建时间', + `modify_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '流程修改时间', + `operator` varchar(32) NOT NULL DEFAULT '' COMMENT '操作人', + `remark` varchar(512) NOT NULL DEFAULT '' COMMENT '备注', + `archive` tinyint(4) NOT NULL DEFAULT '0' COMMENT '归档状态(0未删除,1删除)', + `tenant` varchar(100) NOT NULL DEFAULT '' COMMENT '租户', + `caller` varchar(100) NOT NULL DEFAULT '' COMMENT '调用方', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_flow_deploy_id` (`flow_deploy_id`), + KEY `idx_flow_module_id` (`flow_module_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='流程部署表'; + +DROP TABLE IF EXISTS `ei_flow_instance`; +CREATE TABLE IF NOT EXISTS `ei_flow_instance` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `flow_instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程执行实例id', + `flow_deploy_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程模型部署id', + `flow_module_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程模型id', + `tenant_id` varchar(16) NOT NULL DEFAULT '' COMMENT '业务方标识', + `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(1.执行完成 2.执行中 3.执行终止(强制终止))', + `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '流程创建时间', + `modify_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '流程修改时间', + `archive` tinyint(4) NOT NULL DEFAULT '0' COMMENT '归档状态(0未删除,1删除)', + `tenant` varchar(100) NOT NULL DEFAULT '' COMMENT '租户', + `caller` varchar(100) NOT NULL DEFAULT '' COMMENT '调用方', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_flow_instance_id` (`flow_instance_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='流程执行实例表'; + +DROP TABLE IF EXISTS `ei_node_instance`; +CREATE TABLE IF NOT EXISTS `ei_node_instance` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `node_instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT '节点执行实例id', + `flow_instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程执行实例id', + `source_node_instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT '上一个节点执行实例id', + `instance_data_id` varchar(128) NOT NULL DEFAULT '' COMMENT '实例数据id', + `flow_deploy_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程模型部署id', + `node_key` varchar(64) NOT NULL DEFAULT '' COMMENT '节点唯一标识', + `source_node_key` varchar(64) NOT NULL DEFAULT '' COMMENT '上一个流程节点唯一标识', + `tenant_id` varchar(16) NOT NULL DEFAULT '' COMMENT '业务方标识', + `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(1.处理成功 2.处理中 3.处理失败 4.处理已撤销)', + `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '流程创建时间', + `modify_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '流程修改时间', + `archive` tinyint(4) NOT NULL DEFAULT '0' COMMENT '归档状态(0未删除,1删除)', + `tenant` varchar(100) NOT NULL DEFAULT '' COMMENT '租户', + `caller` varchar(100) NOT NULL DEFAULT '' COMMENT '调用方', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_node_instance_id` (`node_instance_id`), + KEY `idx_fiid_sniid_nk` (`flow_instance_id`,`source_node_instance_id`,`node_key`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='节点执行实例表'; + +DROP TABLE IF EXISTS `ei_node_instance_log`; +CREATE TABLE IF NOT EXISTS `ei_node_instance_log` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `node_instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT '节点执行实例id', + `flow_instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程执行实例id', + `instance_data_id` varchar(128) NOT NULL DEFAULT '' COMMENT '实例数据id', + `node_key` varchar(64) NOT NULL DEFAULT '' COMMENT '节点唯一标识', + `tenant_id` varchar(16) NOT NULL DEFAULT '' COMMENT '业务方标识', + `type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '操作类型(1.系统执行 2.任务提交 3.任务撤销)', + `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态(1.处理成功 2.处理中 3.处理失败 4.处理已撤销)', + `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '流程创建时间', + `archive` tinyint(4) NOT NULL DEFAULT '0' COMMENT '归档状态(0未删除,1删除)', + `tenant` varchar(100) NOT NULL DEFAULT '' COMMENT '租户', + `caller` varchar(100) NOT NULL DEFAULT '' COMMENT '调用方', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='节点执行记录表'; + +DROP TABLE IF EXISTS `ei_instance_data`; +CREATE TABLE IF NOT EXISTS `ei_instance_data` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', + `node_instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT '节点执行实例id', + `flow_instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程执行实例id', + `instance_data_id` varchar(128) NOT NULL DEFAULT '' COMMENT '实例数据id', + `flow_deploy_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程模型部署id', + `flow_module_id` varchar(128) NOT NULL DEFAULT '' COMMENT '流程模型id', + `node_key` varchar(64) NOT NULL DEFAULT '' COMMENT '节点唯一标识', + `tenant_id` varchar(16) NOT NULL DEFAULT '' COMMENT '业务方标识', + `instance_data` longtext COMMENT '数据列表json', + `type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '操作类型(1.实例初始化 2.系统执行 3.系统主动获取 4.上游更新 5.任务提交 6.任务撤回)', + `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '流程创建时间', + `archive` tinyint(4) NOT NULL DEFAULT '0' COMMENT '归档状态(0未删除,1删除)', + `tenant` varchar(100) NOT NULL DEFAULT '' COMMENT '租户', + `caller` varchar(100) NOT NULL DEFAULT '' COMMENT '调用方', + PRIMARY KEY (`id`), + UNIQUE KEY `uniq_instance_data_id` (`instance_data_id`), + KEY `idx_flow_instance_id` (`flow_instance_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='节点执行记录表'; + +-- 在ei_instance_data表中,如果需要存储表情符号, MySQL的建表语句需要切换utf8mb4 \ No newline at end of file diff --git a/demo/src/test/resources/script/turbo-mysql-h2-dml.sql b/demo/src/test/resources/script/turbo-mysql-h2-dml.sql new file mode 100644 index 00000000..f6fe30aa --- /dev/null +++ b/demo/src/test/resources/script/turbo-mysql-h2-dml.sql @@ -0,0 +1,7 @@ +-- 模型定义 +INSERT INTO em_flow_definition (id, flow_module_id, flow_name, flow_key, tenant_id, flow_model, status, create_time, modify_time, operator, remark, archive, tenant, caller) +VALUES (1, 'e7f6a27e-7cc3-11ec-b11c-02420abe030c', '测试流程', 'testFlowKey', '', '{"flowElementList":[{"incoming":[],"outgoing":["Flow_3599vu7"],"dockers":[],"type":2,"properties":{"name":"开始","x":310,"y":200,"text":{"x":310,"y":240,"value":"开始"}},"key":"Event_0vbtunu"},{"incoming":["Flow_3599vu7"],"outgoing":["Flow_1f2ei89"],"dockers":[],"type":4,"properties":{"name":"","x":520,"y":200,"text":""},"key":"Activity_0ivtksn"},{"incoming":["Flow_1f2ei89"],"outgoing":["Flow_1rkk099"],"dockers":[],"type":6,"properties":{"name":"","x":730,"y":200,"text":""},"key":"Gateway_2qj55i1"},{"incoming":["Flow_1rkk099"],"outgoing":[],"dockers":[],"type":3,"properties":{"name":"结束","x":950,"y":200,"text":{"x":950,"y":240,"value":"结束"}},"key":"Event_03pjf39"},{"incoming":["Event_0vbtunu"],"outgoing":["Activity_0ivtksn"],"type":1,"dockers":[],"properties":{"name":"","text":"","startPoint":"{\\\"x\\\":328,\\\"y\\\":200}","endPoint":"{\\\"x\\\":470,\\\"y\\\":200}","pointsList":"\\\"\\\""},"key":"Flow_3599vu7"},{"incoming":["Activity_0ivtksn"],"outgoing":["Gateway_2qj55i1"],"type":1,"dockers":[],"properties":{"name":"","text":"","startPoint":"{\\\"x\\\":570,\\\"y\\\":200}","endPoint":"{\\\"x\\\":705,\\\"y\\\":200}","pointsList":"\\\"\\\""},"key":"Flow_1f2ei89"},{"incoming":["Gateway_2qj55i1"],"outgoing":["Event_03pjf39"],"type":1,"dockers":[],"properties":{"conditionsequenceflow":"a==1","name":"","text":"","startPoint":"{\\\"x\\\":755,\\\"y\\\":200}","endPoint":"{\\\"x\\\":932,\\\"y\\\":200}","pointsList":"\\\"\\\""},"key":"Flow_1rkk099"}]}', 2, '2022-01-24 11:15:39', '2022-01-24 11:33:53', 'testOperator', '测试Turbo', 0, 'testTenant', 'testCaller'); + +-- 模型部署 +INSERT INTO em_flow_deployment (id, flow_deploy_id, flow_module_id, flow_name, flow_key, tenant_id, flow_model, status, create_time, modify_time, operator, remark, archive, tenant, caller) +VALUES (1, '450a101f-ae74-11ed-a29f-42f50c2c0006', 'e7f6a27e-7cc3-11ec-b11c-02420abe030c', '测试流程', 'testFlowKey', '', '{"flowElementList":[{"incoming":[],"outgoing":["Flow_3599vu7"],"dockers":[],"type":2,"properties":{"name":"开始","x":310,"y":200,"text":{"x":310,"y":240,"value":"开始"}},"key":"Event_0vbtunu"},{"incoming":["Flow_3599vu7"],"outgoing":["Flow_1f2ei89"],"dockers":[],"type":4,"properties":{"name":"","x":520,"y":200,"text":""},"key":"Activity_0ivtksn"},{"incoming":["Flow_1f2ei89"],"outgoing":["Flow_1rkk099"],"dockers":[],"type":6,"properties":{"name":"","x":730,"y":200,"text":""},"key":"Gateway_2qj55i1"},{"incoming":["Flow_1rkk099"],"outgoing":[],"dockers":[],"type":3,"properties":{"name":"结束","x":950,"y":200,"text":{"x":950,"y":240,"value":"结束"}},"key":"Event_03pjf39"},{"incoming":["Event_0vbtunu"],"outgoing":["Activity_0ivtksn"],"type":1,"dockers":[],"properties":{"name":"","text":"","startPoint":"{\\\"x\\\":328,\\\"y\\\":200}","endPoint":"{\\\"x\\\":470,\\\"y\\\":200}","pointsList":"\\\"\\\""},"key":"Flow_3599vu7"},{"incoming":["Activity_0ivtksn"],"outgoing":["Gateway_2qj55i1"],"type":1,"dockers":[],"properties":{"name":"","text":"","startPoint":"{\\\"x\\\":570,\\\"y\\\":200}","endPoint":"{\\\"x\\\":705,\\\"y\\\":200}","pointsList":"\\\"\\\""},"key":"Flow_1f2ei89"},{"incoming":["Gateway_2qj55i1"],"outgoing":["Event_03pjf39"],"type":1,"dockers":[],"properties":{"conditionsequenceflow":"a==1","name":"","text":"","startPoint":"{\\\"x\\\":755,\\\"y\\\":200}","endPoint":"{\\\"x\\\":932,\\\"y\\\":200}","pointsList":"\\\"\\\""},"key":"Flow_1rkk099"}]}', 1, '2022-01-24 17:10:31', '2022-01-24 17:10:31', 'testOperator', '', 0, 'testTenant', 'testCaller'); diff --git a/engine/pom.xml b/engine/pom.xml index 63e75f7f..90995706 100644 --- a/engine/pom.xml +++ b/engine/pom.xml @@ -5,13 +5,13 @@ 4.0.0 engine - 1.0.1 + 1.0.2-SNAPSHOT jar turbo com.didiglobal.turbo - 1.0.1 + 1.0.2-SNAPSHOT 2.3.7 @@ -22,75 +22,66 @@ org.springframework.boot spring-boot-starter-actuator - ${spring-boot-starter.version} org.springframework.boot spring-boot-starter - ${spring-boot-starter.version} org.springframework.boot spring-boot-starter-aop - ${spring-boot-starter.version} org.springframework.boot spring-boot-starter-test - ${spring-boot-starter.version} test + + com.baomidou + mybatis-plus-boot-starter + + + com.baomidou + dynamic-datasource-spring-boot-starter + + + org.springframework.boot + spring-boot-starter-aop + + + mysql mysql-connector-java - 8.0.28 runtime org.apache.commons commons-lang3 - 3.4 com.alibaba druid-spring-boot-starter - 1.1.20 com.fasterxml.uuid java-uuid-generator - 3.1.4 com.alibaba fastjson - 1.2.83 - - - commons-collections - commons-collections - 3.2.2 - org.apache.httpcomponents - httpclient - 4.5.13 + org.apache.commons + commons-collections4 org.codehaus.groovy groovy-all - 2.3.7 com.google.guava guava - 31.0.1-jre - - - junit - junit - 4.13.2 - test diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/annotation/EnableTurboEngine.java b/engine/src/main/java/com/didiglobal/turbo/engine/annotation/EnableTurboEngine.java new file mode 100644 index 00000000..c2d98096 --- /dev/null +++ b/engine/src/main/java/com/didiglobal/turbo/engine/annotation/EnableTurboEngine.java @@ -0,0 +1,21 @@ +package com.didiglobal.turbo.engine.annotation; + +import com.didiglobal.turbo.engine.config.TurboEngineConfig; +import org.springframework.context.annotation.Import; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * auto scan spring bean and mybatis mapper path + */ +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Import({TurboEngineConfig.class}) +public @interface EnableTurboEngine { + +} diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/config/HookProperties.java b/engine/src/main/java/com/didiglobal/turbo/engine/config/HookProperties.java deleted file mode 100644 index 92bc1893..00000000 --- a/engine/src/main/java/com/didiglobal/turbo/engine/config/HookProperties.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.didiglobal.turbo.engine.config; - -import com.google.common.base.MoreObjects; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Component -@ConfigurationProperties(prefix = "hook") -public class HookProperties { - private String url; - private Integer timeout; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public Integer getTimeout() { - return timeout; - } - - public void setTimeout(Integer timeout) { - this.timeout = timeout; - } - - @Override - public String toString() { - return MoreObjects.toStringHelper(this) - .add("url", url) - .add("timeout", timeout) - .toString(); - } -} diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/config/TurboEngineConfig.java b/engine/src/main/java/com/didiglobal/turbo/engine/config/TurboEngineConfig.java new file mode 100644 index 00000000..eb166229 --- /dev/null +++ b/engine/src/main/java/com/didiglobal/turbo/engine/config/TurboEngineConfig.java @@ -0,0 +1,15 @@ +package com.didiglobal.turbo.engine.config; + +import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("com.didiglobal.turbo.engine") +@MapperScan("com.didiglobal.turbo.engine.dao") +@EnableAutoConfiguration(exclude = {DruidDataSourceAutoConfigure.class}) +public class TurboEngineConfig { + +} diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/dao/FlowDefinitionDAO.java b/engine/src/main/java/com/didiglobal/turbo/engine/dao/FlowDefinitionDAO.java index 78c610f5..2ab020aa 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/dao/FlowDefinitionDAO.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/dao/FlowDefinitionDAO.java @@ -4,9 +4,9 @@ import com.didiglobal.turbo.engine.dao.mapper.FlowDefinitionMapper; import com.didiglobal.turbo.engine.entity.FlowDefinitionPO; import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Repository; -@Service +@Repository public class FlowDefinitionDAO extends BaseDAO { /** diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/dao/FlowDeploymentDAO.java b/engine/src/main/java/com/didiglobal/turbo/engine/dao/FlowDeploymentDAO.java index f70218de..d56cffa8 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/dao/FlowDeploymentDAO.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/dao/FlowDeploymentDAO.java @@ -2,9 +2,9 @@ import com.didiglobal.turbo.engine.dao.mapper.FlowDeploymentMapper; import com.didiglobal.turbo.engine.entity.FlowDeploymentPO; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Repository; -@Service +@Repository public class FlowDeploymentDAO extends BaseDAO { /** diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/dao/InstanceDataDAO.java b/engine/src/main/java/com/didiglobal/turbo/engine/dao/InstanceDataDAO.java index 0457fb95..a6b59363 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/dao/InstanceDataDAO.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/dao/InstanceDataDAO.java @@ -2,9 +2,9 @@ import com.didiglobal.turbo.engine.dao.mapper.InstanceDataMapper; import com.didiglobal.turbo.engine.entity.InstanceDataPO; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Repository; -@Service +@Repository public class InstanceDataDAO extends BaseDAO { public InstanceDataPO select(String flowInstanceId, String instanceDataId) { diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/dao/NodeInstanceDAO.java b/engine/src/main/java/com/didiglobal/turbo/engine/dao/NodeInstanceDAO.java index debf8330..fc31a072 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/dao/NodeInstanceDAO.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/dao/NodeInstanceDAO.java @@ -4,13 +4,13 @@ import com.didiglobal.turbo.engine.dao.mapper.NodeInstanceMapper; import com.didiglobal.turbo.engine.entity.NodeInstancePO; import com.google.common.collect.Lists; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.stereotype.Service; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Repository; import java.util.Date; import java.util.List; -@Service +@Repository public class NodeInstanceDAO extends BaseDAO { /** diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/dao/NodeInstanceLogDAO.java b/engine/src/main/java/com/didiglobal/turbo/engine/dao/NodeInstanceLogDAO.java index b2b90ff2..a4220e9a 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/dao/NodeInstanceLogDAO.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/dao/NodeInstanceLogDAO.java @@ -2,11 +2,11 @@ import com.didiglobal.turbo.engine.dao.mapper.NodeInstanceLogMapper; import com.didiglobal.turbo.engine.entity.NodeInstanceLogPO; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Repository; import java.util.List; -@Service +@Repository public class NodeInstanceLogDAO extends BaseDAO { /** diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/dao/ProcessInstanceDAO.java b/engine/src/main/java/com/didiglobal/turbo/engine/dao/ProcessInstanceDAO.java index 4b755837..c9fc5141 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/dao/ProcessInstanceDAO.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/dao/ProcessInstanceDAO.java @@ -2,11 +2,11 @@ import com.didiglobal.turbo.engine.dao.mapper.ProcessInstanceMapper; import com.didiglobal.turbo.engine.entity.FlowInstancePO; -import org.springframework.stereotype.Service; +import org.springframework.stereotype.Repository; import java.util.Date; -@Service +@Repository public class ProcessInstanceDAO extends BaseDAO { public FlowInstancePO selectByFlowInstanceId(String flowInstanceId) { diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/executor/ElementExecutor.java b/engine/src/main/java/com/didiglobal/turbo/engine/executor/ElementExecutor.java index 6a1d8afd..1efecfde 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/executor/ElementExecutor.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/executor/ElementExecutor.java @@ -16,6 +16,8 @@ import com.didiglobal.turbo.engine.util.FlowModelUtil; import com.didiglobal.turbo.engine.util.InstanceDataUtil; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import javax.annotation.Resource; @@ -24,6 +26,8 @@ public abstract class ElementExecutor extends RuntimeExecutor { + private static final Logger LOGGER = LoggerFactory.getLogger(ElementExecutor.class); + @Resource protected ExpressionCalculator expressionCalculator; diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/executor/EndEventExecutor.java b/engine/src/main/java/com/didiglobal/turbo/engine/executor/EndEventExecutor.java index dde58344..a0f484b1 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/executor/EndEventExecutor.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/executor/EndEventExecutor.java @@ -8,6 +8,8 @@ import com.didiglobal.turbo.engine.exception.ProcessException; import com.didiglobal.turbo.engine.model.FlowElement; import com.didiglobal.turbo.engine.util.FlowModelUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.text.MessageFormat; @@ -15,6 +17,8 @@ @Service public class EndEventExecutor extends ElementExecutor { + private static final Logger LOGGER = LoggerFactory.getLogger(EndEventExecutor.class); + @Override protected void postExecute(RuntimeContext runtimeContext) throws ProcessException { NodeInstanceBO currentNodeInstance = runtimeContext.getCurrentNodeInstance(); diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/executor/ExclusiveGatewayExecutor.java b/engine/src/main/java/com/didiglobal/turbo/engine/executor/ExclusiveGatewayExecutor.java index 5a93916f..10134b59 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/executor/ExclusiveGatewayExecutor.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/executor/ExclusiveGatewayExecutor.java @@ -1,126 +1,94 @@ package com.didiglobal.turbo.engine.executor; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.didiglobal.turbo.engine.bo.HookInfoResponse; import com.didiglobal.turbo.engine.bo.NodeInstanceBO; -import com.didiglobal.turbo.engine.common.Constants; import com.didiglobal.turbo.engine.common.InstanceDataType; import com.didiglobal.turbo.engine.common.NodeInstanceStatus; import com.didiglobal.turbo.engine.common.RuntimeContext; -import com.didiglobal.turbo.engine.config.HookProperties; import com.didiglobal.turbo.engine.entity.InstanceDataPO; import com.didiglobal.turbo.engine.exception.ProcessException; import com.didiglobal.turbo.engine.model.FlowElement; import com.didiglobal.turbo.engine.model.InstanceData; +import com.didiglobal.turbo.engine.spi.HookService; import com.didiglobal.turbo.engine.util.FlowModelUtil; -import com.didiglobal.turbo.engine.util.HttpUtil; import com.didiglobal.turbo.engine.util.InstanceDataUtil; import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import javax.annotation.Resource; + +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @Service -public class ExclusiveGatewayExecutor extends ElementExecutor { +public class ExclusiveGatewayExecutor extends ElementExecutor implements InitializingBean { - private static final String HOOK_URL_NAME = "infoHook"; - private static final String PARAM_FLOW_INSTANCE_ID = "flowInstanceId"; - private static final String PARAM_DATA_LIST = "dataList"; + private static final Logger LOGGER = LoggerFactory.getLogger(ExclusiveGatewayExecutor.class); @Resource - private HookProperties hookProperties; + private ApplicationContext applicationContext; + + private List hookServices; /** - * Update data map: http request to update data map - * Url: dynamic config + * Update data map: invoke hook service to update data map + * You can implement HookService and all implementations of 'HookService' will be executed. * Param: one of flowElement's properties */ - // TODO: 2019/12/16 common hook in preExecute @Override protected void doExecute(RuntimeContext runtimeContext) throws ProcessException { - //1.get hook param + // 1.get hook param FlowElement flowElement = runtimeContext.getCurrentNodeModel(); String hookInfoParam = FlowModelUtil.getHookInfos(flowElement); - //ignore while properties is empty + + // 2.ignore while properties is empty if (StringUtils.isBlank(hookInfoParam)) { return; } - //http post hook and get data result - Map hookInfoValueMap = getHookInfoValueMap(runtimeContext.getFlowInstanceId(), hookInfoParam); + // 3.invoke hook and get data result + Map hookInfoValueMap = getHookInfoValueMap(runtimeContext.getFlowInstanceId(), hookInfoParam, runtimeContext.getCurrentNodeInstance().getNodeKey(), runtimeContext.getCurrentNodeInstance().getNodeInstanceId()); LOGGER.info("doExecute getHookInfoValueMap.||hookInfoValueMap={}", hookInfoValueMap); if (MapUtils.isEmpty(hookInfoValueMap)) { LOGGER.warn("doExecute: hookInfoValueMap is empty.||flowInstanceId={}||hookInfoParam={}||nodeKey={}", - runtimeContext.getFlowInstanceId(), hookInfoParam, flowElement.getKey()); + runtimeContext.getFlowInstanceId(), hookInfoParam, flowElement.getKey()); return; } - //merge data to current dataMap + // 4.merge data to current dataMap Map dataMap = runtimeContext.getInstanceDataMap(); dataMap.putAll(hookInfoValueMap); - //save data + // 5.save data if (MapUtils.isNotEmpty(dataMap)) { String instanceDataId = saveInstanceDataPO(runtimeContext); runtimeContext.setInstanceDataId(instanceDataId); } } - private Map getHookInfoValueMap(String flowInstanceId, String hookInfoParam) { - //get hook config: url and timeout - String hookUrl = hookProperties.getUrl(); - if (StringUtils.isBlank(hookUrl)) { - LOGGER.info("getHookInfoValueMap: cannot find hookConfig.||flowInstanceId={}", flowInstanceId); - return MapUtils.EMPTY_MAP; - } - - Integer timeout = hookProperties.getTimeout(); - if (timeout == null) { - timeout = Constants.DEFAULT_TIMEOUT; - } - - //build request and http post - Map hookParamMap = Maps.newHashMap(); - hookParamMap.put("flowInstanceId", flowInstanceId); - hookParamMap.put("hookInfoParam", hookInfoParam); - - String responseStr = HttpUtil.postJson(HOOK_URL_NAME, hookUrl, JSONObject.toJSONString(hookParamMap), timeout); - HookInfoResponse hookInfoResponse = JSONObject.parseObject(responseStr, HookInfoResponse.class); - - if (hookInfoResponse == null || hookInfoResponse.getStatus() != 0) { - LOGGER.warn("getHookInfoValueMap failed: hookInfoResponse is null." + - "||hookUrl={}||hookParamMap={}||responseStr={}", hookUrl, hookParamMap, responseStr); - return MapUtils.EMPTY_MAP; - } - - Map data = hookInfoResponse.getData(); - if (MapUtils.isEmpty(data)) { - LOGGER.warn("getHookInfoValueMap failed: data is empty.||hookUrl={}||hookParamMap={}||responseStr={}", - hookUrl, hookParamMap, responseStr); - return MapUtils.EMPTY_MAP; - } - - String respFlowInstanceId = (String) data.get(PARAM_FLOW_INSTANCE_ID); - if (!flowInstanceId.equals(respFlowInstanceId)) { - LOGGER.warn("getHookInfoValueMap failed: flowInstanceId is not match." + - "||hookUrl={}||hookParamMap={}||responseStr={}", hookUrl, hookParamMap, responseStr); - return MapUtils.EMPTY_MAP; - - } - + private Map getHookInfoValueMap(String flowInstanceId, String hookInfoParam, String nodeKey, String nodeInstanceId) { List dataList = Lists.newArrayList(); - JSONArray jsonArray = (JSONArray) data.get(PARAM_DATA_LIST); - for (int i = 0; i < jsonArray.size(); i++) { - InstanceData instanceData = jsonArray.getObject(i, InstanceData.class); - dataList.add(instanceData); + for (HookService service : hookServices) { + try { + List list = service.invoke(flowInstanceId, hookInfoParam, nodeKey, nodeInstanceId); + if (CollectionUtils.isEmpty(list)) { + LOGGER.warn("hook service invoke result is empty, serviceName={}, flowInstanceId={}, hookInfoParam={}", + service.getClass().getName(), flowInstanceId, hookInfoParam); + } + dataList.addAll(list); + } catch (Exception e) { + LOGGER.warn("hook service invoke fail, serviceName={}, flowInstanceId={}, hookInfoParam={}", + service.getClass().getName(), flowInstanceId, hookInfoParam); + } } return InstanceDataUtil.getInstanceDataMap(dataList); } @@ -163,9 +131,35 @@ protected void postExecute(RuntimeContext runtimeContext) throws ProcessExceptio @Override protected RuntimeExecutor getExecuteExecutor(RuntimeContext runtimeContext) throws ProcessException { FlowElement nextNode = calculateNextNode(runtimeContext.getCurrentNodeModel(), - runtimeContext.getFlowElementMap(), runtimeContext.getInstanceDataMap()); + runtimeContext.getFlowElementMap(), runtimeContext.getInstanceDataMap()); runtimeContext.setCurrentNodeModel(nextNode); return executorFactory.getElementExecutor(nextNode); } + + @Override + public void afterPropertiesSet() throws Exception { + ensureHookService(); + } + + private void ensureHookService() { + if (hookServices != null) { + return; + } + + // init hook services by Spring application context + synchronized (ExclusiveGatewayExecutor.class) { + if (hookServices != null) { + return; + } + hookServices = new ArrayList<>(); + String[] names = applicationContext.getBeanNamesForType(HookService.class); + for (String name : names) { + Object bean = applicationContext.getBean(name); + if (bean != null) { + hookServices.add((HookService) bean); + } + } + } + } } diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/executor/FlowExecutor.java b/engine/src/main/java/com/didiglobal/turbo/engine/executor/FlowExecutor.java index f2629184..c8e59d2b 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/executor/FlowExecutor.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/executor/FlowExecutor.java @@ -15,9 +15,11 @@ import com.didiglobal.turbo.engine.util.InstanceDataUtil; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -29,6 +31,8 @@ @Service public class FlowExecutor extends RuntimeExecutor { + private static final Logger LOGGER = LoggerFactory.getLogger(FlowExecutor.class); + @Resource private ProcessInstanceDAO processInstanceDAO; diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/executor/RuntimeExecutor.java b/engine/src/main/java/com/didiglobal/turbo/engine/executor/RuntimeExecutor.java index 096ac1f7..30f1fa29 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/executor/RuntimeExecutor.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/executor/RuntimeExecutor.java @@ -8,15 +8,11 @@ import com.didiglobal.turbo.engine.exception.ProcessException; import com.didiglobal.turbo.engine.util.IdGenerator; import com.didiglobal.turbo.engine.util.StrongUuidGenerator; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import javax.annotation.Resource; public abstract class RuntimeExecutor { - protected static final Logger LOGGER = LoggerFactory.getLogger(RuntimeExecutor.class); - @Resource protected ExecutorFactory executorFactory; @@ -29,11 +25,11 @@ public abstract class RuntimeExecutor { @Resource protected NodeInstanceLogDAO nodeInstanceLogDAO; - private static final IdGenerator idGenerator = new StrongUuidGenerator(); + private static final IdGenerator ID_GENERATOR = new StrongUuidGenerator(); protected String genId() { - return idGenerator.getNextId(); + return ID_GENERATOR.getNextId(); } public abstract void execute(RuntimeContext runtimeContext) throws ProcessException; diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/executor/StartEventExecutor.java b/engine/src/main/java/com/didiglobal/turbo/engine/executor/StartEventExecutor.java index e1adc1ab..6304a3a4 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/executor/StartEventExecutor.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/executor/StartEventExecutor.java @@ -5,6 +5,8 @@ import com.didiglobal.turbo.engine.common.NodeInstanceStatus; import com.didiglobal.turbo.engine.common.RuntimeContext; import com.didiglobal.turbo.engine.exception.ProcessException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import java.util.Collections; @@ -12,6 +14,8 @@ @Service public class StartEventExecutor extends ElementExecutor { + private static final Logger LOGGER = LoggerFactory.getLogger(StartEventExecutor.class); + @Override protected void postExecute(RuntimeContext runtimeContext) throws ProcessException { NodeInstanceBO currentNodeInstance = runtimeContext.getCurrentNodeInstance(); diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/executor/UserTaskExecutor.java b/engine/src/main/java/com/didiglobal/turbo/engine/executor/UserTaskExecutor.java index bbbce0c3..9dd648d0 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/executor/UserTaskExecutor.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/executor/UserTaskExecutor.java @@ -9,6 +9,8 @@ import com.didiglobal.turbo.engine.exception.SuspendException; import com.didiglobal.turbo.engine.model.FlowElement; import com.didiglobal.turbo.engine.util.FlowModelUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -18,6 +20,8 @@ @Service public class UserTaskExecutor extends ElementExecutor { + private static final Logger LOGGER = LoggerFactory.getLogger(UserTaskExecutor.class); + @Override protected void doExecute(RuntimeContext runtimeContext) throws ProcessException { NodeInstanceBO currentNodeInstance = runtimeContext.getCurrentNodeInstance(); diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/processor/RuntimeProcessor.java b/engine/src/main/java/com/didiglobal/turbo/engine/processor/RuntimeProcessor.java index a8deb1e4..50e3836a 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/processor/RuntimeProcessor.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/processor/RuntimeProcessor.java @@ -27,8 +27,8 @@ import com.didiglobal.turbo.engine.validator.ParamValidator; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -126,10 +126,6 @@ public CommitTaskResult commit(CommitTaskParam commitTaskParam) { //2.get flowInstance FlowInstanceBO flowInstanceBO = getFlowInstanceBO(commitTaskParam.getFlowInstanceId()); - if (flowInstanceBO == null) { - LOGGER.warn("commit failed: cannot find flowInstanceBO.||flowInstanceId={}", commitTaskParam.getFlowInstanceId()); - throw new ProcessException(ErrorEnum.GET_FLOW_INSTANCE_FAILED); - } //3.check status if (flowInstanceBO.getStatus() == FlowInstanceStatus.TERMINATED) { @@ -204,10 +200,6 @@ public RollbackTaskResult rollback(RollbackTaskParam rollbackTaskParam) { //2.get flowInstance FlowInstanceBO flowInstanceBO = getFlowInstanceBO(rollbackTaskParam.getFlowInstanceId()); - if (flowInstanceBO == null) { - LOGGER.warn("rollback failed: flowInstanceBO is null.||flowInstanceId={}", rollbackTaskParam.getFlowInstanceId()); - throw new ProcessException(ErrorEnum.GET_FLOW_INSTANCE_FAILED); - } //3.check status if (flowInstanceBO.getStatus() != FlowInstanceStatus.RUNNING) { diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/spi/HookService.java b/engine/src/main/java/com/didiglobal/turbo/engine/spi/HookService.java new file mode 100644 index 00000000..83c5eb4e --- /dev/null +++ b/engine/src/main/java/com/didiglobal/turbo/engine/spi/HookService.java @@ -0,0 +1,27 @@ +package com.didiglobal.turbo.engine.spi; + +import com.didiglobal.turbo.engine.model.InstanceData; + +import java.util.List; + +/** + *

HookService

+ * + * @author lijinghao + * @version v1.0 + * @date 2023/2/16 6:59 PM + */ +public interface HookService { + + /** + * Invoke hook service, used to perform data refresh operations on the gateway node. + * Usage: Implement the interface and give the instance to Spring for management + * + * @param flowInstanceId runtime flow instance id + * @param nodeInstanceId running node's instance id + * @param nodeKey running node's key + * @param hookInfoParam some info , you can refresh + * @return new infos + */ + List invoke(String flowInstanceId, String nodeInstanceId, String nodeKey, String hookInfoParam); +} diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/util/ExpressionCalculator.java b/engine/src/main/java/com/didiglobal/turbo/engine/util/ExpressionCalculator.java index c6c9da22..2a854c71 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/util/ExpressionCalculator.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/util/ExpressionCalculator.java @@ -6,5 +6,13 @@ public interface ExpressionCalculator { + /** + * Execute the conditional expression and get the result of the evaluation + * + * @param expression conditional expression + * @param dataMap data for calculate + * @return true or false + * @throws ProcessException + */ Boolean calculate(String expression, Map dataMap) throws ProcessException; } diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/util/FlowModelUtil.java b/engine/src/main/java/com/didiglobal/turbo/engine/util/FlowModelUtil.java index c9a63be1..f79e33a3 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/util/FlowModelUtil.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/util/FlowModelUtil.java @@ -6,8 +6,8 @@ import com.didiglobal.turbo.engine.model.FlowElement; import com.didiglobal.turbo.engine.model.FlowModel; import com.google.common.collect.Maps; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,19 +29,19 @@ private FlowModelUtil() { */ public static Map getFlowElementMap(String flowModelStr) { if (StringUtils.isBlank(flowModelStr)) { - return MapUtils.EMPTY_MAP; + return Maps.newHashMap(); } FlowModel flowModel = parseModelFromString(flowModelStr); if (flowModel == null) { - return MapUtils.EMPTY_MAP; + return Maps.newHashMap(); } return getFlowElementMap(flowModel.getFlowElementList()); } public static Map getFlowElementMap(List flowElementList) { if (CollectionUtils.isEmpty(flowElementList)) { - return MapUtils.EMPTY_MAP; + return Maps.newHashMap(); } Map flowElementMap = Maps.newHashMap(); flowElementList.forEach(flowElement -> { diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/util/HttpUtil.java b/engine/src/main/java/com/didiglobal/turbo/engine/util/HttpUtil.java deleted file mode 100644 index 67a26a2d..00000000 --- a/engine/src/main/java/com/didiglobal/turbo/engine/util/HttpUtil.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.didiglobal.turbo.engine.util; - -import com.google.common.base.Stopwatch; -import org.apache.commons.lang3.StringUtils; -import org.apache.http.HttpEntity; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.ByteArrayEntity; -import org.apache.http.entity.ContentType; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.util.EntityUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -public class HttpUtil { - - private static final Logger LOGGER = LoggerFactory.getLogger(HttpUtil.class); - - private HttpUtil() {} - - public static String postJson(String urlName, String url, String body, int timeout) { - Long costTime = 0L; - - CloseableHttpClient httpclient = null; - CloseableHttpResponse httpResponse = null; - int code = -1; - String reStr = ""; - try { - Stopwatch stopwatch = Stopwatch.createStarted(); - - httpclient = HttpClients.createDefault(); - HttpPost httpPost = new HttpPost(url); - - body = StringUtils.trimToEmpty(body); - HttpEntity jsonEntity = new ByteArrayEntity(body.getBytes("UTF-8"), ContentType.APPLICATION_JSON); - httpPost.setEntity(jsonEntity); - - RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeout) - .setConnectTimeout(timeout).setSocketTimeout(timeout).build(); - httpPost.setConfig(requestConfig); - - httpResponse = httpclient.execute(httpPost); - costTime = stopwatch.elapsed(TimeUnit.MILLISECONDS); - - code = httpResponse.getStatusLine().getStatusCode(); // 是int,没有拆箱 - HttpEntity entity = httpResponse.getEntity(); - reStr = EntityUtils.toString(entity); // reStr只有body,没有status - return reStr; - } catch (IOException e) { - LOGGER.error("postJson IOException.||urlName={}||url={}||body={}, ", urlName, url, body, e); - return StringUtils.EMPTY; - } finally { - try { - if (httpclient != null) { - httpclient.close(); - } - if (httpResponse != null) { - httpResponse.close(); - } - } catch (IOException e) { - LOGGER.error("postJson exception.||url={}, ", url, e); - } - LOGGER.info("postJson.||urlName={}||url={}||body={}||code={}||reStr={}||costTime={}", - urlName, url, body, code, reStr, costTime); - } - } -} diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/util/InstanceDataUtil.java b/engine/src/main/java/com/didiglobal/turbo/engine/util/InstanceDataUtil.java index 0320d783..abfa4c63 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/util/InstanceDataUtil.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/util/InstanceDataUtil.java @@ -6,8 +6,8 @@ import com.didiglobal.turbo.engine.model.InstanceData; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import java.util.List; @@ -19,7 +19,7 @@ private InstanceDataUtil() {} public static Map getInstanceDataMap(List instanceDataList) { if (CollectionUtils.isEmpty(instanceDataList)) { - return MapUtils.EMPTY_MAP; + return Maps.newHashMap(); } Map instanceDataMap = Maps.newHashMap(); instanceDataList.forEach(instanceData -> { @@ -30,7 +30,7 @@ public static Map getInstanceDataMap(List in public static Map getInstanceDataMap(String instanceDataStr) { if (StringUtils.isBlank(instanceDataStr)) { - return MapUtils.EMPTY_MAP; + return Maps.newHashMap(); } List instanceDataList = JSON.parseArray(instanceDataStr, InstanceData.class); return getInstanceDataMap(instanceDataList); @@ -56,7 +56,7 @@ public static String getInstanceDataListStr(Map instanceDa public static Map parseInstanceDataMap(Map instanceDataMap) { if (MapUtils.isEmpty(instanceDataMap)) { - return MapUtils.EMPTY_MAP; + return Maps.newHashMap(); } Map dataMap = Maps.newHashMap(); instanceDataMap.forEach((keyName, instanceData) -> { diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/validator/ElementValidator.java b/engine/src/main/java/com/didiglobal/turbo/engine/validator/ElementValidator.java index c3d45e32..b4769ae5 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/validator/ElementValidator.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/validator/ElementValidator.java @@ -5,7 +5,7 @@ import com.didiglobal.turbo.engine.exception.DefinitionException; import com.didiglobal.turbo.engine.model.FlowElement; import com.didiglobal.turbo.engine.util.FlowModelUtil; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/validator/EndEventValidator.java b/engine/src/main/java/com/didiglobal/turbo/engine/validator/EndEventValidator.java index 580b8404..b9bd67e3 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/validator/EndEventValidator.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/validator/EndEventValidator.java @@ -2,7 +2,7 @@ import com.didiglobal.turbo.engine.common.ErrorEnum; import com.didiglobal.turbo.engine.model.FlowElement; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/validator/ExclusiveGatewayValidator.java b/engine/src/main/java/com/didiglobal/turbo/engine/validator/ExclusiveGatewayValidator.java index 17aea495..f91169ae 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/validator/ExclusiveGatewayValidator.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/validator/ExclusiveGatewayValidator.java @@ -4,7 +4,7 @@ import com.didiglobal.turbo.engine.exception.DefinitionException; import com.didiglobal.turbo.engine.model.FlowElement; import com.didiglobal.turbo.engine.util.FlowModelUtil; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/validator/FlowModelValidator.java b/engine/src/main/java/com/didiglobal/turbo/engine/validator/FlowModelValidator.java index 5d6e8720..7e87c377 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/validator/FlowModelValidator.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/validator/FlowModelValidator.java @@ -9,7 +9,7 @@ import com.didiglobal.turbo.engine.model.FlowModel; import com.didiglobal.turbo.engine.util.FlowModelUtil; import com.google.common.collect.Maps; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/validator/ModelValidator.java b/engine/src/main/java/com/didiglobal/turbo/engine/validator/ModelValidator.java index 3ae7ca5a..4b0eda01 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/validator/ModelValidator.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/validator/ModelValidator.java @@ -5,7 +5,7 @@ import com.didiglobal.turbo.engine.exception.ProcessException; import com.didiglobal.turbo.engine.model.FlowModel; import com.didiglobal.turbo.engine.util.FlowModelUtil; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/engine/src/main/java/com/didiglobal/turbo/engine/validator/StartEventValidator.java b/engine/src/main/java/com/didiglobal/turbo/engine/validator/StartEventValidator.java index 60c11900..02044a00 100644 --- a/engine/src/main/java/com/didiglobal/turbo/engine/validator/StartEventValidator.java +++ b/engine/src/main/java/com/didiglobal/turbo/engine/validator/StartEventValidator.java @@ -2,7 +2,7 @@ import com.didiglobal.turbo.engine.common.ErrorEnum; import com.didiglobal.turbo.engine.model.FlowElement; -import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; diff --git a/pom.xml b/pom.xml index 13b5c124..72dc8fc1 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.didiglobal.turbo turbo pom - 1.0.1 + 1.0.2-SNAPSHOT turbo Turbo is a light-weight flow engine framework, support BPMN2.0 https://www.github.com/didi/turbo @@ -40,6 +40,11 @@ Didi http://www.didiglobal.com + + lijinghao + Didi + http://www.didiglobal.com + @@ -50,89 +55,89 @@ UTF-8 1.8 + + 1.5.10.RELEASE + 4.4 + 3.12.0 + 8.0.28 + 1.1.20 + 3.2.0 + 2.5.7 + 3.1.4 + 1.2.83 2.3.7 - 1.5.10.RELEASE + 31.0.1-jre - - - javax.annotation - jsr250-api - 1.0 - - - org.springframework.boot - spring-boot-starter - ${spring-boot-starter.version} - - - org.springframework.boot - spring-boot-starter-test - ${spring-boot-starter.version} - test - - - org.apache.commons - commons-lang3 - 3.4 - - - com.alibaba - druid-spring-boot-starter - 1.1.20 - - - com.baomidou - mybatis-plus-boot-starter - 3.2.0 - - - com.baomidou - dynamic-datasource-spring-boot-starter - 2.5.7 - - - org.springframework.boot - spring-boot-starter-aop - - - - - org.projectlombok - lombok - 1.18.4 - - - com.fasterxml.uuid - java-uuid-generator - 3.1.4 - - - com.alibaba - fastjson - 1.2.83 - - - commons-collections - commons-collections - 3.2.2 - - - org.apache.httpcomponents - httpclient - 4.5.13 - - - org.codehaus.groovy - groovy-all - 2.3.7 - - - com.google.guava - guava - 31.0.1-jre - - + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring-boot.version} + pom + import + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + mysql + mysql-connector-java + ${mysql-connector-java.version} + runtime + + + com.baomidou + mybatis-plus-boot-starter + ${baomidou-mybatis-plus.version} + + + com.baomidou + dynamic-datasource-spring-boot-starter + ${baomidou-dynamic-datasource.versioin} + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.fasterxml.uuid + java-uuid-generator + ${java-uuid-generator.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.codehaus.groovy + groovy-all + ${groovy.version} + + + com.google.guava + guava + ${guava.version} + + + @@ -189,6 +194,7 @@ jar + ${java.home}/../bin/javadoc ${javadoc.opts}