diff --git a/config/nacos/ruoyi-easyretry-server.yml b/config/nacos/ruoyi-easyretry-server.yml new file mode 100644 index 000000000..c2da4ae1a --- /dev/null +++ b/config/nacos/ruoyi-easyretry-server.yml @@ -0,0 +1,42 @@ +spring: + datasource: + type: com.zaxxer.hikari.HikariDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: ${datasource.job.url} + username: ${datasource.job.username} + password: ${datasource.job.password} + hikari: + connection-timeout: 30000 + validation-timeout: 5000 + minimum-idle: 10 + maximum-pool-size: 20 + idle-timeout: 600000 + max-lifetime: 900000 + keepaliveTime: 30000 + +# easy-retry 服务端配置 +easy-retry: + # 当前使用的数据库类型 + db-type: mysql + # 拉取重试数据的每批次的大小 + retry-pull-page-size: 1000 + # 拉取重试数据的每批次的大小 + job-pull-page-size: 1000 + # 服务端 netty 端口 + netty-port: 1788 + # 重试和死信表的分区总数 + total-partition: 2 + # 一个客户端每秒最多接收的重试数量指令 + limiter: 1000 + # 号段模式下步长配置 + step: 100 + # 日志保存时间(单位: day) + log-storage: 90 + # 回调配置 + callback: + #回调最大执行次数 + max-count: 288 + #间隔时间 + trigger-interval: 900 + mode: all + retry-max-pull-count: 10 diff --git a/config/nacos/ruoyi-job.yml b/config/nacos/ruoyi-job.yml index 7041f72bd..33c68afea 100644 --- a/config/nacos/ruoyi-job.yml +++ b/config/nacos/ruoyi-job.yml @@ -31,3 +31,13 @@ powerjob: # 调度中心应用名 通过服务名连接调度中心(启用 server-name 会导致 server-address 不生效) server-name: ruoyi-powerjob-server store-strategy: disk + +easy-retry: + enabled: true + # 需要在EasyRetry后台组管理创建对应名称的组,然后创建任务的时候选择对应的组,才能正确分派任务 + group-name: "ruoyi_group" + server: + host: 127.0.0.1 + port: 1788 + # 详见 script/sql/easy_retry.sql `namespace` 表 + namespace: ${spring.profiles.active} diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 6cb1538f7..4fc903505 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -180,6 +180,20 @@ services: privileged: true network_mode: "host" + ruoyi-easyretry-server: + image: ruoyi/ruoyi-easyretry-server:2.2.0 + container_name: ruoyi-easyretry-server + environment: + # 时区上海 + TZ: Asia/Shanghai + ports: + - "8800:8800" + - "1788:1788" + volumes: + - /docker/easyretry/logs/:/ruoyi/easyretry/logs + privileged: true + network_mode: "host" + ruoyi-gateway: image: ruoyi/ruoyi-gateway:2.2.0 container_name: ruoyi-gateway diff --git a/pom.xml b/pom.xml index b8529cddd..001918683 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,7 @@ 3.27.0 2.2.7 4.3.6 + 3.1.0 1.37.0 1.18.30 7.4 @@ -279,6 +280,23 @@ ${powerjob.version} + + + com.aizuda + easy-retry-client-starter + ${easyretry.version} + + + com.aizuda + easy-retry-client-core + ${easyretry.version} + + + com.aizuda + easy-retry-client-job-core + ${easyretry.version} + + org.bouncycastle diff --git a/ruoyi-common/ruoyi-common-job/pom.xml b/ruoyi-common/ruoyi-common-job/pom.xml index 0df7fee48..3b6905d8a 100644 --- a/ruoyi-common/ruoyi-common-job/pom.xml +++ b/ruoyi-common/ruoyi-common-job/pom.xml @@ -44,6 +44,23 @@ powerjob-official-processors + + + com.aizuda + easy-retry-client-starter + ${easyretry.version} + + + com.aizuda + easy-retry-client-core + ${easyretry.version} + + + com.aizuda + easy-retry-client-job-core + ${easyretry.version} + + org.projectlombok lombok diff --git a/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/EasyRetryConfig.java b/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/EasyRetryConfig.java new file mode 100644 index 000000000..efce6efb0 --- /dev/null +++ b/ruoyi-common/ruoyi-common-job/src/main/java/org/dromara/common/job/config/EasyRetryConfig.java @@ -0,0 +1,19 @@ +package org.dromara.common.job.config; + +import com.aizuda.easy.retry.client.starter.EnableEasyRetry; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * 启动定时任务 + * + * @author dhb52 + * @since 2024/3/12 + */ +@AutoConfiguration +@ConditionalOnProperty(prefix = "easy-retry", name = "enabled", havingValue = "true") +@EnableScheduling +@EnableEasyRetry(group = "${easy-retry.group-name}") +public class EasyRetryConfig { +} diff --git a/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 222bcc15d..2e3dc3209 100644 --- a/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-common/ruoyi-common-job/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1,2 @@ org.dromara.common.job.config.PowerJobConfig +org.dromara.common.job.config.EasyRetryConfig diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/easyretry/TestAnnoJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/easyretry/TestAnnoJobExecutor.java new file mode 100644 index 000000000..05c4f2fb0 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/easyretry/TestAnnoJobExecutor.java @@ -0,0 +1,23 @@ +package org.dromara.job.easyretry; + +import com.aizuda.easy.retry.client.job.core.annotation.JobExecutor; +import com.aizuda.easy.retry.client.job.core.dto.JobArgs; +import com.aizuda.easy.retry.client.model.ExecuteResult; +import com.aizuda.easy.retry.common.core.util.JsonUtil; +import com.aizuda.easy.retry.common.log.EasyRetryLog; +import org.springframework.stereotype.Component; + +/** + * @author www.byteblogs.com + * @date 2023-09-28 22:54:07 + */ +@Component +@JobExecutor(name = "testJobExecutor") +public class TestAnnoJobExecutor { + + public ExecuteResult jobExecute(JobArgs jobArgs) { + EasyRetryLog.LOCAL.info("testJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs)); + EasyRetryLog.REMOTE.info("testJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs)); + return ExecuteResult.success("测试成功"); + } +} diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/easyretry/TestClassJobExecutor.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/easyretry/TestClassJobExecutor.java new file mode 100644 index 000000000..d675cec73 --- /dev/null +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/easyretry/TestClassJobExecutor.java @@ -0,0 +1,19 @@ +package org.dromara.job.easyretry; + +import com.aizuda.easy.retry.client.job.core.dto.JobArgs; +import com.aizuda.easy.retry.client.job.core.executor.AbstractJobExecutor; +import com.aizuda.easy.retry.client.model.ExecuteResult; +import org.springframework.stereotype.Component; + +/** + * @author www.byteblogs.com + * @date 2023-09-28 22:54:07 + */ +@Component +public class TestClassJobExecutor extends AbstractJobExecutor { + + @Override + protected ExecuteResult doJobExecute(JobArgs jobArgs) { + return ExecuteResult.success("TestJobExecutor测试成功"); + } +} diff --git a/ruoyi-visual/pom.xml b/ruoyi-visual/pom.xml index 513e1cf0b..dadc40c29 100644 --- a/ruoyi-visual/pom.xml +++ b/ruoyi-visual/pom.xml @@ -14,6 +14,7 @@ ruoyi-seata-server ruoyi-nacos ruoyi-powerjob-server + ruoyi-easyretry-server ruoyi-visual diff --git a/ruoyi-visual/ruoyi-easyretry-server/Dockerfile b/ruoyi-visual/ruoyi-easyretry-server/Dockerfile new file mode 100644 index 000000000..7ad0a0776 --- /dev/null +++ b/ruoyi-visual/ruoyi-easyretry-server/Dockerfile @@ -0,0 +1,18 @@ +#FROM findepi/graalvm:java17-native +FROM openjdk:17.0.2-oraclelinux8 + +MAINTAINER Lion Li + +RUN mkdir -p /ruoyi/easyretry/logs + +WORKDIR /ruoyi/easyretry + +ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 JAVA_OPTS="-Xms512m -Xmx1024m" + +EXPOSE 8800 +EXPOSE 1788 + +ADD ./target/ruoyi-easyretry-server.jar ./app.jar + +ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar app.jar \ + -XX:+HeapDumpOnOutOfMemoryError -Xlog:gc*,:time,tags,level -XX:+UseZGC ${JAVA_OPTS} diff --git a/ruoyi-visual/ruoyi-easyretry-server/pom.xml b/ruoyi-visual/ruoyi-easyretry-server/pom.xml new file mode 100644 index 000000000..9647513e2 --- /dev/null +++ b/ruoyi-visual/ruoyi-easyretry-server/pom.xml @@ -0,0 +1,51 @@ + + + + org.dromara + ruoyi-visual + ${revision} + + 4.0.0 + jar + ruoyi-easyretry-server + + + + com.aizuda + easy-retry-server-starter + ${easyretry.version} + + + + org.dromara + ruoyi-common-nacos + + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin.version} + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + repackage + + + + + + + + diff --git a/ruoyi-visual/ruoyi-easyretry-server/src/main/java/org/dromara/easyretry/EasyRetryServerApplication.java b/ruoyi-visual/ruoyi-easyretry-server/src/main/java/org/dromara/easyretry/EasyRetryServerApplication.java new file mode 100644 index 000000000..9d01bc05b --- /dev/null +++ b/ruoyi-visual/ruoyi-easyretry-server/src/main/java/org/dromara/easyretry/EasyRetryServerApplication.java @@ -0,0 +1,18 @@ +package org.dromara.easyretry; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * EasyRetry Server 启动程序 + * + * @author dhb52 + */ +@SpringBootApplication +public class EasyRetryServerApplication { + + public static void main(String[] args) { + SpringApplication.run(com.aizuda.easy.retry.server.EasyRetryServerApplication.class, args); + } + +} diff --git a/ruoyi-visual/ruoyi-easyretry-server/src/main/resources/application.yml b/ruoyi-visual/ruoyi-easyretry-server/src/main/resources/application.yml new file mode 100644 index 000000000..f8ea995ea --- /dev/null +++ b/ruoyi-visual/ruoyi-easyretry-server/src/main/resources/application.yml @@ -0,0 +1,58 @@ +server: + port: 8800 + servlet: + context-path: /easy-retry + +spring: + application: + name: ruoyi-easyretry-server + profiles: + active: @profiles.active@ + web: + resources: + static-locations: classpath:admin/ + +mybatis-plus: + typeAliasesPackage: com.aizuda.easy.retry.template.datasource.persistence.po + global-config: + db-config: + where-strategy: NOT_EMPTY + capital-mode: false + logic-delete-value: 1 + logic-not-delete-value: 0 + configuration: + map-underscore-to-camel-case: true + cache-enabled: true + +logging: + config: classpath:logback-plus.xml + +management: + endpoints: + web: + exposure: + include: '*' + endpoint: + health: + show-details: ALWAYS + logfile: + external-file: ./logs/${spring.application.name}/console.log + +--- # nacos 配置 +spring: + cloud: + nacos: + # nacos 服务地址 + server-addr: @nacos.server@ + discovery: + # 注册组 + group: @nacos.discovery.group@ + namespace: ${spring.profiles.active} + config: + # 配置组 + group: @nacos.config.group@ + namespace: ${spring.profiles.active} + config: + import: + - optional:nacos:datasource.yml + - optional:nacos:${spring.application.name}.yml diff --git a/ruoyi-visual/ruoyi-easyretry-server/src/main/resources/banner.txt b/ruoyi-visual/ruoyi-easyretry-server/src/main/resources/banner.txt new file mode 100644 index 000000000..869a4209c --- /dev/null +++ b/ruoyi-visual/ruoyi-easyretry-server/src/main/resources/banner.txt @@ -0,0 +1,10 @@ +Application Version: ${revision} +Spring Boot Version: ${spring-boot.version} + _ + | | + ___ __ _ ___ _ _ ______ _ __ ___| |_ _ __ _ _ ______ ___ ___ _ ____ _____ _ __ + / _ \/ _` / __| | | |______| '__/ _ \ __| '__| | | |______/ __|/ _ \ '__\ \ / / _ \ '__| +| __/ (_| \__ \ |_| | | | | __/ |_| | | |_| | \__ \ __/ | \ V / __/ | + \___|\__,_|___/\__, | |_| \___|\__|_| \__, | |___/\___|_| \_/ \___|_| + __/ | __/ | + |___/ |___/ diff --git a/ruoyi-visual/ruoyi-easyretry-server/src/main/resources/logback-plus.xml b/ruoyi-visual/ruoyi-easyretry-server/src/main/resources/logback-plus.xml new file mode 100644 index 000000000..b9d6d8fce --- /dev/null +++ b/ruoyi-visual/ruoyi-easyretry-server/src/main/resources/logback-plus.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + ${console.log.pattern} + utf-8 + + + + + + + + + + + + + + + + + + + + + diff --git a/sql/easy_retry.sql b/sql/easy_retry.sql new file mode 100644 index 000000000..23f5142c5 --- /dev/null +++ b/sql/easy_retry.sql @@ -0,0 +1,543 @@ +SET NAMES utf8mb4; + +DROP TABLE IF EXISTS `namespace`; +CREATE TABLE `namespace` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(64) NOT NULL COMMENT '名称', + `unique_id` varchar(64) NOT NULL COMMENT '唯一id', + `description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除 1、删除', + PRIMARY KEY (`id`), + KEY `idx_name` (`name`), + UNIQUE KEY `uk_unique_id` (`unique_id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='命名空间'; + +INSERT INTO `namespace` VALUES (1, 'Development', 'dev', '', now(), now(), 0); +INSERT INTO `namespace` VALUES (2, 'Production', 'prod', '', now(), now(), 0); + +DROP TABLE IF EXISTS `group_config`; +CREATE TABLE `group_config` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL DEFAULT '' COMMENT '组名称', + `description` varchar(256) NOT NULL DEFAULT '' COMMENT '组描述', + `group_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '组状态 0、未启用 1、启用', + `version` int(11) NOT NULL COMMENT '版本号', + `group_partition` int(11) NOT NULL COMMENT '分区', + `id_generator_mode` tinyint(4) NOT NULL DEFAULT '1' COMMENT '唯一id生成模式 默认号段模式', + `init_scene` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否初始化场景 0:否 1:是', + `bucket_index` int(11) NOT NULL DEFAULT '0' COMMENT 'bucket', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_namespace_id_group_name` (`namespace_id`, `group_name`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='组配置' +; + +INSERT INTO `group_config` VALUES (1, 'dev', 'ruoyi_group', '', 1, 1, 0, 1, 1, 4, now(), now()); + +DROP TABLE IF EXISTS `notify_config`; +CREATE TABLE `notify_config` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `notify_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '通知状态 0、未启用 1、启用', + `notify_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '通知类型 1、钉钉 2、邮件 3、企业微信', + `notify_attribute` varchar(512) NOT NULL COMMENT '配置属性', + `notify_threshold` int(11) NOT NULL DEFAULT '0' COMMENT '通知阈值', + `notify_scene` tinyint(4) NOT NULL DEFAULT '0' COMMENT '通知场景', + `rate_limiter_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '限流状态 0、未启用 1、启用', + `rate_limiter_threshold` int(11) NOT NULL DEFAULT '0' COMMENT '每秒限流阈值', + `description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='通知配置' +; + +DROP TABLE IF EXISTS `retry_dead_letter_0`; +CREATE TABLE `retry_dead_letter_0` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id', + `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', + `executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称', + `args_str` text NOT NULL COMMENT '执行方法参数', + `ext_attrs` text NOT NULL COMMENT '扩展字段', + `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务类型 1、重试数据 2、回调数据', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`), + KEY `idx_idempotent_id` (`idempotent_id`), + KEY `idx_biz_no` (`biz_no`), + KEY `idx_create_dt` (`create_dt`), + UNIQUE KEY `uk_namespace_id_group_name_unique_id` (`namespace_id`, `group_name`, `unique_id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='死信队列表' +; + +DROP TABLE IF EXISTS `retry_task_0`; +CREATE TABLE `retry_task_0` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id', + `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', + `executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称', + `args_str` text NOT NULL COMMENT '执行方法参数', + `ext_attrs` text NOT NULL COMMENT '扩展字段', + `next_trigger_at` datetime NOT NULL COMMENT '下次触发时间', + `retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', + `retry_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '重试状态 0、重试中 1、成功 2、最大重试次数', + `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务类型 1、重试数据 2、回调数据', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`), + KEY `idx_namespace_id_group_name_task_type` (`namespace_id`, `group_name`, `task_type`), + KEY `idx_namespace_id_group_name_retry_status` (`namespace_id`, `group_name`, `retry_status`), + KEY `idx_idempotent_id` (`idempotent_id`), + KEY `idx_biz_no` (`biz_no`), + KEY `idx_create_dt` (`create_dt`), + UNIQUE KEY `uk_name_unique_id` (`namespace_id`, `group_name`, `unique_id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='任务表' +; + +DROP TABLE IF EXISTS `retry_task_log`; +CREATE TABLE `retry_task_log` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `idempotent_id` varchar(64) NOT NULL COMMENT '幂等id', + `biz_no` varchar(64) NOT NULL DEFAULT '' COMMENT '业务编号', + `executor_name` varchar(512) NOT NULL DEFAULT '' COMMENT '执行器名称', + `args_str` text NOT NULL COMMENT '执行方法参数', + `ext_attrs` text NOT NULL COMMENT '扩展字段', + `retry_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '重试状态 0、重试中 1、成功 2、最大次数', + `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务类型 1、重试数据 2、回调数据', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`), + KEY `idx_retry_status` (`retry_status`), + KEY `idx_idempotent_id` (`idempotent_id`), + KEY `idx_unique_id` (`unique_id`), + KEY `idx_biz_no` (`biz_no`), + KEY `idx_create_dt` (`create_dt`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='任务日志基础信息表' +; + +DROP TABLE IF EXISTS `retry_task_log_message`; +CREATE TABLE `retry_task_log_message` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `unique_id` varchar(64) NOT NULL COMMENT '同组下id唯一', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `message` text NOT NULL COMMENT '异常信息', + `client_info` varchar(128) DEFAULT NULL COMMENT '客户端地址 clientId#ip:port', + PRIMARY KEY (`id`), + KEY `idx_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `unique_id`), + KEY `idx_create_dt` (`create_dt`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='任务调度日志信息记录表' +; + +DROP TABLE IF EXISTS `scene_config`; +CREATE TABLE `scene_config` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `scene_name` varchar(64) NOT NULL COMMENT '场景名称', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `scene_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '组状态 0、未启用 1、启用', + `max_retry_count` int(11) NOT NULL DEFAULT '5' COMMENT '最大重试次数', + `back_off` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1、默认等级 2、固定间隔时间 3、CRON 表达式', + `trigger_interval` varchar(16) NOT NULL DEFAULT '' COMMENT '间隔时长', + `deadline_request` bigint(20) unsigned NOT NULL DEFAULT '60000' COMMENT 'Deadline Request 调用链超时 单位毫秒', + `executor_timeout` int(11) unsigned NOT NULL DEFAULT '5' COMMENT '任务执行超时时间,单位秒', + `route_key` tinyint(4) NOT NULL DEFAULT '4' COMMENT '路由策略', + `description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_namespace_id_group_name_scene_name` (`namespace_id`, `group_name`, `scene_name`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='场景配置' +; + +DROP TABLE IF EXISTS `server_node`; +CREATE TABLE `server_node` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `host_id` varchar(64) NOT NULL COMMENT '主机id', + `host_ip` varchar(64) NOT NULL COMMENT '机器ip', + `context_path` varchar(256) NOT NULL DEFAULT '/' COMMENT '客户端上下文路径 server.servlet.context-path', + `host_port` int(16) NOT NULL COMMENT '机器端口', + `expire_at` datetime NOT NULL COMMENT '过期时间', + `node_type` tinyint(4) NOT NULL COMMENT '节点类型 1、客户端 2、是服务端', + `ext_attrs` varchar(256) NULL default '' COMMENT '扩展字段', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`), + KEY `idx_expire_at_node_type` (`expire_at`, `node_type`), + UNIQUE KEY `uk_host_id_host_ip` (`host_id`, `host_ip`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='服务器节点' +; + +DROP TABLE IF EXISTS `distributed_lock`; +CREATE TABLE `distributed_lock` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `name` varchar(64) NOT NULL COMMENT '锁名称', + `lock_until` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '锁定时长', + `locked_at` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '锁定时间', + `locked_by` varchar(255) NOT NULL COMMENT '锁定者', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_name` (`name`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='锁定表' +; + +DROP TABLE IF EXISTS `system_user`; +CREATE TABLE `system_user` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `username` varchar(64) NOT NULL COMMENT '账号', + `password` varchar(128) NOT NULL COMMENT '密码', + `role` tinyint(4) NOT NULL DEFAULT '0' COMMENT '角色:1-普通用户、2-管理员', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_username` (`username`) USING BTREE +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='系统用户表'; + +-- pwd: admin +INSERT INTO `system_user` VALUES (1, 'admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2, now(), now()); + +DROP TABLE IF EXISTS `system_user_permission`; +CREATE TABLE `system_user_permission` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `system_user_id` bigint(20) NOT NULL COMMENT '系统用户id', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_namespace_id_group_name_system_user_id` (`namespace_id`, `group_name`, `system_user_id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='系统用户权限表'; + +DROP TABLE IF EXISTS `sequence_alloc`; +CREATE TABLE `sequence_alloc` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL DEFAULT '' COMMENT '组名称', + `max_id` bigint(20) NOT NULL DEFAULT '1' COMMENT '最大id', + `step` int(11) NOT NULL DEFAULT '100' COMMENT '步长', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_namespace_id_group_name` (`namespace_id`, `group_name`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='号段模式序号ID分配表'; + +-- 分布式调度DDL +DROP TABLE IF EXISTS `job`; +CREATE TABLE `job` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `job_name` varchar(64) NOT NULL COMMENT '名称', + `args_str` text DEFAULT NULL COMMENT '执行方法参数', + `args_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '参数类型 ', + `next_trigger_at` bigint(13) NOT NULL COMMENT '下次触发时间', + `job_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务状态 0、关闭、1、开启', + `task_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '任务类型 1、集群 2、广播 3、切片', + `route_key` tinyint(4) NOT NULL DEFAULT '4' COMMENT '路由策略', + `executor_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '执行器类型', + `executor_info` varchar(255) DEFAULT NULL COMMENT '执行器名称', + `trigger_type` tinyint(4) NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间', + `trigger_interval` varchar(255) NOT NULL COMMENT '间隔时长', + `block_strategy` tinyint(4) NOT NULL DEFAULT '1' COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行', + `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒', + `max_retry_times` int(11) NOT NULL DEFAULT '0' COMMENT '最大重试次数', + `parallel_num` int(11) NOT NULL DEFAULT '1' COMMENT '并行数', + `retry_interval` int(11) NOT NULL DEFAULT '0' COMMENT '重试间隔(s)', + `bucket_index` int(11) NOT NULL DEFAULT '0' COMMENT 'bucket', + `resident` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否是常驻任务', + `description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述', + `ext_attrs` varchar(256) NULL default '' COMMENT '扩展字段', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除 1、删除', + PRIMARY KEY (`id`), + KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`), + KEY `idx_job_status_bucket_index` (`job_status`, `bucket_index`), + KEY `idx_create_dt` (`create_dt`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='任务信息'; + +INSERT INTO `job` VALUES (1, 'dev', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', '', now(), now(), 0); + +DROP TABLE IF EXISTS `job_log_message`; +CREATE TABLE `job_log_message` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `job_id` bigint(20) NOT NULL COMMENT '任务信息id', + `task_batch_id` bigint(20) NOT NULL COMMENT '任务批次id', + `task_id` bigint(20) NOT NULL COMMENT '调度任务id', + `message` longtext NOT NULL COMMENT '调度信息', + `log_num` int(11) NOT NULL DEFAULT 1 COMMENT '日志数量', + `real_time` bigint(13) NOT NULL DEFAULT 0 COMMENT '上报时间', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `ext_attrs` varchar(256) NULL default '' COMMENT '扩展字段', + PRIMARY KEY (`id`), + KEY `idx_task_batch_id_task_id` (`task_batch_id`, `task_id`), + KEY `idx_create_dt` (`create_dt`), + KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='调度日志'; + +DROP TABLE IF EXISTS `job_task`; +CREATE TABLE `job_task` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `job_id` bigint(20) NOT NULL COMMENT '任务信息id', + `task_batch_id` bigint(20) NOT NULL COMMENT '调度任务id', + `parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父执行器id', + `task_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '执行的状态 0、失败 1、成功', + `retry_count` int(11) NOT NULL DEFAULT '0' COMMENT '重试次数', + `client_info` varchar(128) DEFAULT NULL COMMENT '客户端地址 clientId#ip:port', + `result_message` text NOT NULL COMMENT '执行结果', + `args_str` text DEFAULT NULL COMMENT '执行方法参数', + `args_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '参数类型 ', + `ext_attrs` varchar(256) NULL default '' COMMENT '扩展字段', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_task_batch_id_task_status` (`task_batch_id`, `task_status`), + KEY `idx_create_dt` (`create_dt`), + KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='任务实例'; + +DROP TABLE IF EXISTS `job_task_batch`; +CREATE TABLE `job_task_batch` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `job_id` bigint(20) NOT NULL COMMENT '任务id', + `workflow_node_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '工作流节点id', + `parent_workflow_node_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '工作流任务父批次id', + `workflow_task_batch_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '工作流任务批次id', + `task_batch_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '任务批次状态 0、失败 1、成功', + `operation_reason` tinyint(4) NOT NULL DEFAULT '0' COMMENT '操作原因', + `execution_at` bigint(13) NOT NULL DEFAULT '0' COMMENT '任务执行时间', + `system_task_type` tinyint(4) NOT NULL DEFAULT '3' COMMENT '任务类型 3、JOB任务 4、WORKFLOW任务', + `parent_id` varchar(64) NOT NULL DEFAULT '' COMMENT '父节点', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除 1、删除', + `ext_attrs` varchar(256) NULL default '' COMMENT '扩展字段', + PRIMARY KEY (`id`), + KEY `idx_job_id_task_batch_status` (`job_id`, `task_batch_status`), + KEY `idx_create_dt` (`create_dt`), + KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`), + KEY `idx_workflow_task_batch_id_workflow_node_id` (`workflow_task_batch_id`,`workflow_node_id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='任务批次'; + +DROP TABLE IF EXISTS `job_notify_config`; +CREATE TABLE `job_notify_config` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `job_id` bigint(20) NOT NULL COMMENT '任务id', + `notify_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '通知状态 0、未启用 1、启用', + `notify_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '通知类型 1、钉钉 2、邮件 3、企业微信', + `notify_attribute` varchar(512) NOT NULL COMMENT '配置属性', + `notify_threshold` int(11) NOT NULL DEFAULT '0' COMMENT '通知阈值', + `notify_scene` tinyint(4) NOT NULL DEFAULT '0' COMMENT '通知场景', + `rate_limiter_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '限流状态 0、未启用 1、启用', + `rate_limiter_threshold` int(11) NOT NULL DEFAULT '0' COMMENT '每秒限流阈值', + `description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_namespace_id_group_name_job_id` (`namespace_id`, `group_name`, job_id) +) ENGINE = InnoDB + AUTO_INCREMENT = 4 + DEFAULT CHARSET = utf8mb4 COMMENT ='job通知配置'; + +DROP TABLE IF EXISTS `job_summary`; +CREATE TABLE `job_summary` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '组名称', + `job_id` bigint NOT NULL COMMENT '任务信息id', + `trigger_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '统计时间', + `success_num` int NOT NULL DEFAULT '0' COMMENT '执行成功-日志数量', + `fail_num` int NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量', + `fail_reason` varchar(512) NOT NULL DEFAULT '' COMMENT '失败原因', + `stop_num` int NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量', + `stop_reason` varchar(512) NOT NULL DEFAULT '' COMMENT '失败原因', + `cancel_num` int NOT NULL DEFAULT '0' COMMENT '执行失败-日志数量', + `cancel_reason` varchar(512) NOT NULL DEFAULT '' COMMENT '失败原因', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + KEY `idx_namespace_id_group_name_job_id` (`namespace_id`, `group_name`, job_id), + UNIQUE KEY `uk_job_id_trigger_at` (`job_id`, `trigger_at`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = utf8mb4 COMMENT ='DashBoard_Job'; + +DROP TABLE IF EXISTS `retry_summary`; +CREATE TABLE `retry_summary` +( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '组名称', + `scene_name` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '场景名称', + `trigger_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '统计时间', + `running_num` int NOT NULL DEFAULT '0' COMMENT '重试中-日志数量', + `finish_num` int NOT NULL DEFAULT '0' COMMENT '重试完成-日志数量', + `max_count_num` int NOT NULL DEFAULT '0' COMMENT '重试到达最大次数-日志数量', + `suspend_num` int NOT NULL DEFAULT '0' COMMENT '暂停重试-日志数量', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_scene_name_trigger_at` (`namespace_id`, `group_name`, `scene_name`, `trigger_at`) USING BTREE +) ENGINE = InnoDB + AUTO_INCREMENT = 1 + DEFAULT CHARSET = utf8mb4 COMMENT ='DashBoard_Retry'; + +DROP TABLE IF EXISTS `workflow`; +CREATE TABLE `workflow` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `workflow_name` varchar(64) NOT NULL COMMENT '工作流名称', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `workflow_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '工作流状态 0、关闭、1、开启', + `trigger_type` tinyint(4) NOT NULL COMMENT '触发类型 1.CRON 表达式 2. 固定时间', + `trigger_interval` varchar(255) NOT NULL COMMENT '间隔时长', + `next_trigger_at` bigint(13) NOT NULL COMMENT '下次触发时间', + `block_strategy` tinyint(4) NOT NULL DEFAULT '1' COMMENT '阻塞策略 1、丢弃 2、覆盖 3、并行', + `executor_timeout` int(11) NOT NULL DEFAULT '0' COMMENT '任务执行超时时间,单位秒', + `description` varchar(256) NOT NULL DEFAULT '' COMMENT '描述', + `flow_info` text DEFAULT NULL COMMENT '流程信息', + `bucket_index` int(11) NOT NULL DEFAULT '0' COMMENT 'bucket', + `version` int(11) NOT NULL COMMENT '版本号', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除 1、删除', + `ext_attrs` varchar(256) NULL default '' COMMENT '扩展字段', + PRIMARY KEY (`id`), + KEY `idx_create_dt` (`create_dt`), + KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='工作流'; + +DROP TABLE IF EXISTS `workflow_node`; +CREATE TABLE `workflow_node` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `node_name` varchar(64) NOT NULL COMMENT '节点名称', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `job_id` bigint(20) NOT NULL COMMENT '任务信息id', + `workflow_id` bigint(20) NOT NULL COMMENT '工作流ID', + `node_type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '1、任务节点 2、条件节点', + `expression_type` tinyint(4) NOT NULL DEFAULT 0 COMMENT '1、SpEl、2、Aviator 3、QL', + `fail_strategy` tinyint(4) NOT NULL DEFAULT 1 COMMENT '失败策略 1、跳过 2、阻塞', + `workflow_node_status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '工作流节点状态 0、关闭、1、开启', + `priority_level` int(11) NOT NULL DEFAULT 1 COMMENT '优先级', + `node_info` text DEFAULT NULL COMMENT '节点信息 ', + `version` int(11) NOT NULL COMMENT '版本号', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除 1、删除', + `ext_attrs` varchar(256) NULL default '' COMMENT '扩展字段', + PRIMARY KEY (`id`), + KEY `idx_create_dt` (`create_dt`), + KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='工作流节点'; + +DROP TABLE IF EXISTS `workflow_task_batch`; +CREATE TABLE `workflow_task_batch` +( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id', + `group_name` varchar(64) NOT NULL COMMENT '组名称', + `workflow_id` bigint(20) NOT NULL COMMENT '工作流任务id', + `task_batch_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '任务批次状态 0、失败 1、成功', + `operation_reason` tinyint(4) NOT NULL DEFAULT '0' COMMENT '操作原因', + `flow_info` text DEFAULT NULL COMMENT '流程信息', + `execution_at` bigint(13) NOT NULL DEFAULT '0' COMMENT '任务执行时间', + `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '逻辑删除 1、删除', + `ext_attrs` varchar(256) NULL default '' COMMENT '扩展字段', + PRIMARY KEY (`id`), + KEY `idx_job_id_task_batch_status` (`workflow_id`, `task_batch_status`), + KEY `idx_create_dt` (`create_dt`), + KEY `idx_namespace_id_group_name` (`namespace_id`, `group_name`) +) ENGINE = InnoDB + AUTO_INCREMENT = 0 + DEFAULT CHARSET = utf8mb4 COMMENT ='工作流批次'; diff --git a/sql/postgres/easy_retry.sql b/sql/postgres/easy_retry.sql new file mode 100644 index 000000000..fa0a07ede --- /dev/null +++ b/sql/postgres/easy_retry.sql @@ -0,0 +1,800 @@ +-- PostgreSQL DDL + +CREATE TABLE namespace +( + id BIGSERIAL PRIMARY KEY, + name VARCHAR(64) NOT NULL, + unique_id VARCHAR(64) NOT NULL, + description VARCHAR(256) NOT NULL DEFAULT '', + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted SMALLINT NOT NULL DEFAULT 0 +); + +CREATE UNIQUE INDEX uk_namespace_unique_id ON "namespace" (unique_id); + +COMMENT ON COLUMN namespace.id IS '主键'; +COMMENT ON COLUMN namespace.name IS '名称'; +COMMENT ON COLUMN namespace.unique_id IS '唯一id'; +COMMENT ON COLUMN namespace.description IS '描述'; +COMMENT ON COLUMN namespace.create_dt IS '创建时间'; +COMMENT ON COLUMN namespace.update_dt IS '修改时间'; +COMMENT ON COLUMN namespace.deleted IS '逻辑删除 1、删除'; +COMMENT ON TABLE namespace IS '命名空间'; + +INSERT INTO namespace VALUES (1, 'Development', 'dev', '', now(), now(), 0); +INSERT INTO namespace VALUES (2, 'Production', 'prod', '', now(), now(), 0); + +CREATE TABLE group_config +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + description VARCHAR(256) NOT NULL, + group_status SMALLINT NOT NULL DEFAULT 0, + version INT NOT NULL, + group_partition INT NOT NULL, + id_generator_mode SMALLINT NOT NULL DEFAULT 1, + init_scene SMALLINT NOT NULL DEFAULT 0, + bucket_index INT NOT NULL DEFAULT 0, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX "uk_namespace_id_group_name_group_config" ON "group_config" ("namespace_id", "group_name"); + +COMMENT ON COLUMN "group_config"."id" IS '主键'; +COMMENT ON COLUMN "group_config"."namespace_id" IS '命名空间'; +COMMENT ON COLUMN "group_config"."group_name" IS '组名称'; +COMMENT ON COLUMN "group_config"."description" IS '组描述'; +COMMENT ON COLUMN "group_config"."group_status" IS '组状态 0、未启用 1、启用'; +COMMENT ON COLUMN "group_config"."version" IS '版本号'; +COMMENT ON COLUMN "group_config"."group_partition" IS '分区'; +COMMENT ON COLUMN "group_config"."id_generator_mode" IS '唯一id生成模式 默认号段模式'; +COMMENT ON COLUMN "group_config"."init_scene" IS '是否初始化场景 0:否 1:是'; +COMMENT ON COLUMN "group_config"."bucket_index" IS 'bucket'; +COMMENT ON COLUMN "group_config"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "group_config"."update_dt" IS '修改时间'; +COMMENT ON TABLE "group_config" IS '组配置'; + +INSERT INTO group_config VALUES (1, 'dev', 'ruoyi_group', '', 1, 1, 0, 1, 1, 4, now(), now()); + +CREATE TABLE notify_config +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + scene_name VARCHAR(64) NOT NULL, + notify_status SMALLINT NOT NULL DEFAULT 0, + notify_type SMALLINT NOT NULL DEFAULT 0, + notify_attribute VARCHAR(512) NOT NULL, + notify_threshold INT NOT NULL DEFAULT 0, + notify_scene SMALLINT NOT NULL DEFAULT 0, + rate_limiter_status SMALLINT NOT NULL DEFAULT 0, + rate_limiter_threshold INT NOT NULL DEFAULT 0, + description VARCHAR(256) NOT NULL DEFAULT '', + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX idx_namespace_id_group_name ON notify_config (namespace_id, group_name); + +COMMENT ON COLUMN "notify_config"."id" IS '主键'; +COMMENT ON COLUMN "notify_config"."group_name" IS '组名称'; +COMMENT ON COLUMN "notify_config"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "notify_config"."scene_name" IS '场景名称'; +COMMENT ON COLUMN "notify_config"."notify_status" IS '通知状态 0、未启用 1、启用'; +COMMENT ON COLUMN "notify_config"."notify_type" IS '通知类型 1、钉钉 2、邮件 3、企业微信'; +COMMENT ON COLUMN "notify_config"."notify_attribute" IS '配置属性'; +COMMENT ON COLUMN "notify_config"."notify_threshold" IS '通知阈值'; +COMMENT ON COLUMN "notify_config"."notify_scene" IS '通知场景'; +COMMENT ON COLUMN "notify_config"."rate_limiter_status" IS '限流状态 0、未启用 1、启用'; +COMMENT ON COLUMN "notify_config"."rate_limiter_threshold" IS '每秒限流阈值'; +COMMENT ON COLUMN "notify_config"."description" IS '描述'; +COMMENT ON COLUMN "notify_config"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "notify_config"."update_dt" IS '修改时间'; +COMMENT ON TABLE "notify_config" IS '通知配置'; + + +CREATE TABLE retry_dead_letter_0 +( + id BIGSERIAL PRIMARY KEY, + unique_id VARCHAR(64) NOT NULL, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + scene_name VARCHAR(64) NOT NULL, + idempotent_id VARCHAR(64) NOT NULL, + biz_no VARCHAR(64) NOT NULL DEFAULT '', + executor_name VARCHAR(512) NOT NULL DEFAULT '', + args_str TEXT NOT NULL, + ext_attrs TEXT NOT NULL, + task_type SMALLINT NOT NULL DEFAULT 1, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX "uk_namespace_id_group_name_unique_id_retry_dead_letter" ON "retry_dead_letter_0" ("namespace_id", "group_name", "unique_id"); +CREATE INDEX "idx_namespace_id_group_name_scene_name_retry_dead_letter" ON "retry_dead_letter_0" ("namespace_id", "group_name", "scene_name"); +CREATE INDEX "idx_idempotent_id_retry_dead_letter" ON "retry_dead_letter_0" ("idempotent_id"); +CREATE INDEX "idx_biz_no_retry_dead_letter" ON "retry_dead_letter_0" ("biz_no"); +CREATE INDEX "idx_create_dt_retry_dead_letter" ON "retry_dead_letter_0" ("create_dt"); + +COMMENT ON COLUMN "retry_dead_letter_0"."id" IS '主键'; +COMMENT ON COLUMN "retry_dead_letter_0"."unique_id" IS '同组下id唯一'; +COMMENT ON COLUMN "retry_dead_letter_0"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "retry_dead_letter_0"."group_name" IS '组名称'; +COMMENT ON COLUMN "retry_dead_letter_0"."scene_name" IS '场景名称'; +COMMENT ON COLUMN "retry_dead_letter_0"."idempotent_id" IS '幂等id'; +COMMENT ON COLUMN "retry_dead_letter_0"."biz_no" IS '业务编号'; +COMMENT ON COLUMN "retry_dead_letter_0"."executor_name" IS '执行器名称'; +COMMENT ON COLUMN "retry_dead_letter_0"."args_str" IS '执行方法参数'; +COMMENT ON COLUMN "retry_dead_letter_0"."ext_attrs" IS '扩展字段'; +COMMENT ON COLUMN "retry_dead_letter_0"."task_type" IS '任务类型 1、重试数据 2、回调数据'; +COMMENT ON COLUMN "retry_dead_letter_0"."create_dt" IS '创建时间'; +COMMENT ON TABLE "retry_dead_letter_0" IS '死信队列表'; + +CREATE TABLE retry_task_0 +( + id BIGSERIAL PRIMARY KEY, + unique_id VARCHAR(64) NOT NULL, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + scene_name VARCHAR(64) NOT NULL, + idempotent_id VARCHAR(64) NOT NULL, + biz_no VARCHAR(64) NOT NULL DEFAULT '', + executor_name VARCHAR(512) NOT NULL DEFAULT '', + args_str TEXT NOT NULL, + ext_attrs TEXT NOT NULL, + next_trigger_at TIMESTAMP NOT NULL, + retry_count INT NOT NULL DEFAULT 0, + retry_status SMALLINT NOT NULL DEFAULT 0, + task_type SMALLINT NOT NULL DEFAULT 1, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX "uk_name_unique_id_retry_task" ON "retry_task_0" ("namespace_id", "group_name", "unique_id"); +CREATE INDEX "idx_namespace_id_group_name_scene_name_retry_task" ON "retry_task_0" ("namespace_id", "group_name", "scene_name"); +CREATE INDEX "idx_namespace_id_group_name_retry_status_retry_task" ON "retry_task_0" (namespace_id, group_name, "retry_status"); +CREATE INDEX "idx_idempotent_id_retry_task" ON "retry_task_0" ("idempotent_id"); +CREATE INDEX "idx_biz_no_retry_task" ON "retry_task_0" ("biz_no"); +CREATE INDEX "idx_create_dt_retry_task" ON "retry_task_0" ("create_dt"); + +COMMENT ON COLUMN "retry_task_0"."id" IS '主键'; +COMMENT ON COLUMN "retry_task_0"."unique_id" IS '同组下id唯一'; +COMMENT ON COLUMN "retry_task_0"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "retry_task_0"."group_name" IS '组名称'; +COMMENT ON COLUMN "retry_task_0"."scene_name" IS '场景名称'; +COMMENT ON COLUMN "retry_task_0"."idempotent_id" IS '幂等id'; +COMMENT ON COLUMN "retry_task_0"."biz_no" IS '业务编号'; +COMMENT ON COLUMN "retry_task_0"."executor_name" IS '执行器名称'; +COMMENT ON COLUMN "retry_task_0"."args_str" IS '执行方法参数'; +COMMENT ON COLUMN "retry_task_0"."ext_attrs" IS '扩展字段'; +COMMENT ON COLUMN "retry_task_0"."next_trigger_at" IS '下次触发时间'; +COMMENT ON COLUMN "retry_task_0"."retry_count" IS '重试次数'; +COMMENT ON COLUMN "retry_task_0"."retry_status" IS '重试状态 0、重试中 1、成功 2、最大重试次数'; +COMMENT ON COLUMN "retry_task_0"."task_type" IS '任务类型 1、重试数据 2、回调数据'; +COMMENT ON COLUMN "retry_task_0"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "retry_task_0"."update_dt" IS '修改时间'; +COMMENT ON TABLE "retry_task_0" IS '任务表'; + +CREATE TABLE retry_task_log +( + id BIGSERIAL PRIMARY KEY, + unique_id VARCHAR(64) NOT NULL, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + scene_name VARCHAR(64) NOT NULL, + idempotent_id VARCHAR(64) NOT NULL, + biz_no VARCHAR(64) NOT NULL DEFAULT '', + executor_name VARCHAR(512) NOT NULL DEFAULT '', + args_str TEXT NOT NULL, + ext_attrs TEXT NOT NULL, + retry_status SMALLINT NOT NULL DEFAULT 0, + task_type SMALLINT NOT NULL DEFAULT 1, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX "idx_group_name_scene_name_retry_task_log" ON "retry_task_log" ("namespace_id", "group_name", "scene_name"); +CREATE INDEX "idx_retry_status_retry_task_log" ON "retry_task_log" ("retry_status"); +CREATE INDEX "idx_idempotent_id_retry_task_log" ON "retry_task_log" ("idempotent_id"); +CREATE INDEX "idx_unique_id" ON "retry_task_log" ("namespace_id", "group_name", "unique_id"); +CREATE INDEX "idx_biz_no_retry_task_log" ON "retry_task_log" ("biz_no"); +CREATE INDEX "idx_create_dt_retry_task_log" ON "retry_task_log" ("create_dt"); + +COMMENT ON COLUMN "retry_task_log"."id" IS '主键'; +COMMENT ON COLUMN "retry_task_log"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "retry_task_log"."unique_id" IS '同组下id唯一'; +COMMENT ON COLUMN "retry_task_log"."group_name" IS '组名称'; +COMMENT ON COLUMN "retry_task_log"."scene_name" IS '场景名称'; +COMMENT ON COLUMN "retry_task_log"."idempotent_id" IS '幂等id'; +COMMENT ON COLUMN "retry_task_log"."biz_no" IS '业务编号'; +COMMENT ON COLUMN "retry_task_log"."executor_name" IS '执行器名称'; +COMMENT ON COLUMN "retry_task_log"."args_str" IS '执行方法参数'; +COMMENT ON COLUMN "retry_task_log"."ext_attrs" IS '扩展字段'; +COMMENT ON COLUMN "retry_task_log"."retry_status" IS '重试状态 0、重试中 1、成功 2、最大次数'; +COMMENT ON COLUMN "retry_task_log"."task_type" IS '任务类型 1、重试数据 2、回调数据'; +COMMENT ON COLUMN "retry_task_log"."create_dt" IS '创建时间'; +COMMENT ON TABLE "retry_task_log" IS '任务日志基础信息表'; + +CREATE TABLE retry_task_log_message +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + unique_id VARCHAR(64) NOT NULL, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + message TEXT NOT NULL, + client_info VARCHAR(128) DEFAULT NULL +); + +CREATE INDEX "idx_namespace_id_group_name_unique_id" ON "retry_task_log_message" ("namespace_id", "group_name", "unique_id"); +CREATE INDEX "idx_create_dt" ON "retry_task_log_message" ("create_dt"); +COMMENT ON COLUMN "retry_task_log_message"."id" IS '主键'; +COMMENT ON COLUMN "retry_task_log_message"."namespace_id" IS '命名空间'; +COMMENT ON COLUMN "retry_task_log_message"."group_name" IS '组名称'; +COMMENT ON COLUMN "retry_task_log_message"."unique_id" IS '同组下id唯一'; +COMMENT ON COLUMN "retry_task_log_message"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "retry_task_log_message"."message" IS '异常信息'; +COMMENT ON COLUMN "retry_task_log_message"."client_info" IS '客户端地址 clientId#ip:port'; +COMMENT ON TABLE "retry_task_log_message" IS '任务调度日志信息记录表'; + +CREATE TABLE scene_config +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + scene_name VARCHAR(64) NOT NULL, + group_name VARCHAR(64) NOT NULL, + scene_status SMALLINT NOT NULL DEFAULT 0, + max_retry_count INT NOT NULL DEFAULT 5, + back_off SMALLINT NOT NULL DEFAULT 1, + trigger_interval VARCHAR(16) NOT NULL DEFAULT '', + deadline_request BIGINT NOT NULL DEFAULT 60000, + route_key SMALLINT NOT NULL DEFAULT 4, + executor_timeout INT NOT NULL DEFAULT 5, + description VARCHAR(256) NOT NULL DEFAULT '', + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX "uk_namespace_id_group_name_scene_name" ON "scene_config" ("namespace_id", "group_name","scene_name"); +COMMENT ON COLUMN "scene_config"."id" IS '主键'; +COMMENT ON COLUMN "scene_config"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "scene_config"."scene_name" IS '场景名称'; +COMMENT ON COLUMN "scene_config"."group_name" IS '组名称'; +COMMENT ON COLUMN "scene_config"."scene_status" IS '组状态 0、未启用 1、启用'; +COMMENT ON COLUMN "scene_config"."max_retry_count" IS '最大重试次数'; +COMMENT ON COLUMN "scene_config"."back_off" IS '1、默认等级 2、固定间隔时间 3、CRON 表达式'; +COMMENT ON COLUMN "scene_config"."trigger_interval" IS '间隔时长'; +COMMENT ON COLUMN "scene_config"."deadline_request" IS 'Deadline Request 调用链超时 单位毫秒'; +COMMENT ON COLUMN "scene_config"."description" IS '描述'; +COMMENT ON COLUMN "scene_config"."route_key" IS '路由策略'; +COMMENT ON COLUMN "scene_config"."executor_timeout" IS '超时时间'; +COMMENT ON COLUMN "scene_config"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "scene_config"."update_dt" IS '修改时间'; +COMMENT ON TABLE "scene_config" IS '场景配置'; + +CREATE TABLE server_node +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + host_id VARCHAR(64) NOT NULL, + host_ip VARCHAR(64) NOT NULL, + context_path VARCHAR(256) NOT NULL DEFAULT '/', + host_port INT NOT NULL, + expire_at TIMESTAMP NOT NULL, + node_type SMALLINT NOT NULL, + ext_attrs VARCHAR(256) DEFAULT '', + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX "uk_host_id_host_ip" ON "server_node" ("host_id","host_ip"); +CREATE INDEX "idx_expire_at_node_type" ON "server_node" ("expire_at","node_type"); +CREATE INDEX "idx_namespace_id_group_name_server_node" ON "server_node" ("namespace_id", "group_name"); + +COMMENT ON COLUMN "server_node"."id" IS '主键'; +COMMENT ON COLUMN "server_node"."group_name" IS '组名称'; +COMMENT ON COLUMN "server_node"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "server_node"."host_id" IS '主机id'; +COMMENT ON COLUMN "server_node"."host_ip" IS '机器ip'; +COMMENT ON COLUMN "server_node"."context_path" IS '客户端上下文路径 server.servlet.context-path'; +COMMENT ON COLUMN "server_node"."host_port" IS '机器端口'; +COMMENT ON COLUMN "server_node"."expire_at" IS '过期时间'; +COMMENT ON COLUMN "server_node"."node_type" IS '节点类型 1、客户端 2、是服务端'; +COMMENT ON COLUMN "server_node"."ext_attrs" IS '扩展字段'; +COMMENT ON COLUMN "server_node"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "server_node"."update_dt" IS '修改时间'; +COMMENT ON TABLE "server_node" IS '服务器节点'; + +CREATE TABLE distributed_lock +( + id BIGSERIAL PRIMARY KEY, + name VARCHAR(64) NOT NULL, + lock_until TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + locked_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + locked_by VARCHAR(255) NOT NULL, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +ALTER TABLE distributed_lock ADD CONSTRAINT uk_name UNIQUE (name); + +COMMENT ON COLUMN "distributed_lock"."id" IS '主键'; +COMMENT ON COLUMN "distributed_lock"."name" IS '锁名称'; +COMMENT ON COLUMN "distributed_lock"."lock_until" IS '锁定时长'; +COMMENT ON COLUMN "distributed_lock"."locked_at" IS '锁定时间'; +COMMENT ON COLUMN "distributed_lock"."locked_by" IS '锁定者'; +COMMENT ON COLUMN "distributed_lock"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "distributed_lock"."update_dt" IS '修改时间'; +COMMENT ON TABLE "distributed_lock" IS '锁定表'; + + +CREATE TABLE system_user +( + id BIGSERIAL PRIMARY KEY, + username VARCHAR(64) NOT NULL, + password VARCHAR(128) NOT NULL, + role SMALLINT NOT NULL DEFAULT 0, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX "uk_username" ON "system_user" ("username"); +COMMENT ON COLUMN "system_user"."id" IS '主键'; +COMMENT ON COLUMN "system_user"."username" IS '账号'; +COMMENT ON COLUMN "system_user"."password" IS '密码'; +COMMENT ON COLUMN "system_user"."role" IS '角色:1-普通用户、2-管理员'; +COMMENT ON COLUMN "system_user"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "system_user"."update_dt" IS '修改时间'; +COMMENT ON TABLE "system_user" IS '系统用户表'; + +-- pwd: admin +INSERT INTO system_user VALUES (1, 'admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2, now(), now()); + + +CREATE TABLE system_user_permission +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + system_user_id BIGINT NOT NULL, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX "uk_namespace_id_group_name_system_user_id" ON "system_user_permission" ("namespace_id","group_name","system_user_id"); +COMMENT ON COLUMN "system_user_permission"."id" IS '主键'; +COMMENT ON COLUMN "system_user_permission"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "system_user_permission"."group_name" IS '组名称'; +COMMENT ON COLUMN "system_user_permission"."system_user_id" IS '系统用户id'; +COMMENT ON COLUMN "system_user_permission"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "system_user_permission"."update_dt" IS '修改时间'; +COMMENT ON TABLE "system_user_permission" IS '系统用户权限表'; + + +CREATE TABLE sequence_alloc +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL DEFAULT '', + max_id BIGINT NOT NULL DEFAULT 1, + step INT NOT NULL DEFAULT 100, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX "uk_namespace_id_group_name" ON "sequence_alloc" ("namespace_id", "group_name"); + +COMMENT ON COLUMN "sequence_alloc"."id" IS '主键'; +COMMENT ON COLUMN "sequence_alloc"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "sequence_alloc"."group_name" IS '组名称'; +COMMENT ON COLUMN "sequence_alloc"."max_id" IS '最大id'; +COMMENT ON COLUMN "sequence_alloc"."step" IS '步长'; +COMMENT ON COLUMN "sequence_alloc"."update_dt" IS '更新时间'; +COMMENT ON TABLE "sequence_alloc" IS '号段模式序号ID分配表'; + +-- 分布式调度DDL +CREATE TABLE job +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + job_name VARCHAR(64) NOT NULL, + args_str TEXT NOT NULL DEFAULT '', + args_type SMALLINT NOT NULL DEFAULT 1, + next_trigger_at BIGINT NOT NULL, + job_status SMALLINT NOT NULL DEFAULT 1, + task_type SMALLINT NOT NULL DEFAULT 1, + route_key SMALLINT NOT NULL DEFAULT 4, + executor_type SMALLINT NOT NULL DEFAULT 1, + executor_info VARCHAR(255) DEFAULT NULL, + trigger_type SMALLINT NOT NULL, + trigger_interval VARCHAR(255) NOT NULL, + block_strategy SMALLINT NOT NULL DEFAULT 1, + executor_timeout INT NOT NULL DEFAULT 0, + max_retry_times INT NOT NULL DEFAULT 0, + parallel_num INT NOT NULL DEFAULT 1, + retry_interval INT NOT NULL DEFAULT 0, + bucket_index INT NOT NULL DEFAULT 0, + resident SMALLINT NOT NULL DEFAULT 0, + description VARCHAR(256) NOT NULL DEFAULT '', + ext_attrs VARCHAR(256) DEFAULT NULL, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted SMALLINT NOT NULL DEFAULT 0 +); + +CREATE INDEX "idx_namespace_id_group_name_job" ON "job" ("namespace_id", "group_name"); +CREATE INDEX "idx_job_status_bucket_index_job" ON "job" ("job_status", "bucket_index"); +CREATE INDEX "idx_create_dt_job" ON "job" ("create_dt"); + +COMMENT ON COLUMN "job"."id" IS '主键'; +COMMENT ON COLUMN "job"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "job"."group_name" IS '组名称'; +COMMENT ON COLUMN "job"."job_name" IS '名称'; +COMMENT ON COLUMN "job"."args_str" IS '执行方法参数'; +COMMENT ON COLUMN "job"."args_type" IS '参数类型'; +COMMENT ON COLUMN "job"."next_trigger_at" IS '下次触发时间'; +COMMENT ON COLUMN "job"."job_status" IS '重试状态 0、关闭、1、开启'; +COMMENT ON COLUMN "job"."task_type" IS '任务类型 1、集群 2、广播 3、切片'; +COMMENT ON COLUMN "job"."route_key" IS '路由策略'; +COMMENT ON COLUMN "job"."executor_type" IS '执行器类型'; +COMMENT ON COLUMN "job"."executor_info" IS '执行器名称'; +COMMENT ON COLUMN "job"."trigger_type" IS '触发类型 1.CRON 表达式 2. 固定时间'; +COMMENT ON COLUMN "job"."trigger_interval" IS '间隔时长'; +COMMENT ON COLUMN "job"."block_strategy" IS '阻塞策略 1、丢弃 2、覆盖 3、并行'; +COMMENT ON COLUMN "job"."executor_timeout" IS '任务执行超时时间,单位秒'; +COMMENT ON COLUMN "job"."max_retry_times" IS '最大重试次数'; +COMMENT ON COLUMN "job"."parallel_num" IS '并行数'; +COMMENT ON COLUMN "job"."retry_interval" IS '更新重试间隔(s)'; +COMMENT ON COLUMN "job"."bucket_index" IS 'bucket'; +COMMENT ON COLUMN "job"."resident" IS '是否是常驻任务'; +COMMENT ON COLUMN "job"."description" IS '描述'; +COMMENT ON COLUMN "job"."ext_attrs" IS '扩展字段'; +COMMENT ON COLUMN "job"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "job"."deleted" IS '逻辑删除 1、删除'; +COMMENT ON COLUMN "job"."update_dt" IS '更新时间'; +COMMENT ON TABLE "job" IS '任务信息'; + +INSERT INTO job VALUES (1, 'dev', 'ruoyi_group', 'demo-job', null, 1, 1710344035622, 1, 1, 4, 1, 'testJobExecutor', 2, '60', 1, 60, 3, 1, 1, 116, 0, '', '', now(), now(), 0); + +CREATE TABLE job_log_message +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + job_id BIGINT NOT NULL, + task_batch_id BIGINT NOT NULL, + task_id BIGINT NOT NULL, + message TEXT NOT NULL, + log_num INT NOT NULL DEFAULT 1, + real_time BIGINT NOT NULL DEFAULT 0, + ext_attrs VARCHAR(256) DEFAULT '', + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX "idx_namespace_id_group_name_to_job_log_message" ON "job_log_message" ("namespace_id", "group_name"); +CREATE INDEX "idx_task_batch_id_task_id_to_job_log_message" ON "job_log_message" ("task_batch_id", "task_id"); +CREATE INDEX "idx_create_dt_to_job_log_message" ON "job_log_message" ("create_dt"); + +COMMENT ON COLUMN "job_log_message"."id" IS '主键'; +COMMENT ON COLUMN "job_log_message"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "job_log_message"."group_name" IS '组名称'; +COMMENT ON COLUMN "job_log_message"."job_id" IS '任务信息id'; +COMMENT ON COLUMN "job_log_message"."task_batch_id" IS '任务批次id'; +COMMENT ON COLUMN "job_log_message"."task_id" IS '调度任务id'; +COMMENT ON COLUMN "job_log_message"."message" IS '调度信息'; +COMMENT ON COLUMN "job_log_message"."log_num" IS '日志序号'; +COMMENT ON COLUMN "job_log_message"."real_time" IS '实际时间'; +COMMENT ON COLUMN "job_log_message"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "job_log_message"."ext_attrs" IS '扩展字段'; +COMMENT ON TABLE "job_log_message" IS '调度日志'; + +CREATE TABLE job_task +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + job_id BIGINT NOT NULL, + task_batch_id BIGINT NOT NULL, + parent_id BIGINT NOT NULL DEFAULT 0, + task_status SMALLINT NOT NULL DEFAULT 0, + retry_count INT NOT NULL DEFAULT 0, + client_info VARCHAR(128) DEFAULT NULL, + result_message TEXT NOT NULL, + args_str TEXT NOT NULL, + args_type SMALLINT NOT NULL DEFAULT 1, + ext_attrs VARCHAR(256) DEFAULT '', + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + + +CREATE INDEX "idx_namespace_id_group_name_to_job_task" ON "job_task" ("namespace_id", "group_name"); +CREATE INDEX "idx_task_batch_id_task_status_to_job_task" ON "job_task" ("task_batch_id", "task_status"); +CREATE INDEX "idx_create_dt_to_job_task" ON "job_task" ("create_dt"); +COMMENT ON COLUMN "job_task"."id" IS '主键'; +COMMENT ON COLUMN "job_task"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "job_task"."group_name" IS '组名称'; +COMMENT ON COLUMN "job_task"."job_id" IS '任务信息id'; +COMMENT ON COLUMN "job_task"."task_batch_id" IS '任务批次id'; +COMMENT ON COLUMN "job_task"."parent_id" IS '父执行器id'; +COMMENT ON COLUMN "job_task"."task_status" IS '执行的状态 0、失败 1、成功'; +COMMENT ON COLUMN "job_task"."retry_count" IS '重试次数'; +COMMENT ON COLUMN "job_task"."client_info" IS '客户端地址 clientId#ip:port'; +COMMENT ON COLUMN "job_task"."result_message" IS '调度信息'; +COMMENT ON COLUMN "job_task"."args_str" IS '执行方法参数'; +COMMENT ON COLUMN "job_task"."args_type" IS '参数类型'; +COMMENT ON COLUMN "job_task"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "job_task"."update_dt" IS '创建时间'; +COMMENT ON COLUMN "job_task"."ext_attrs" IS '扩展字段'; +COMMENT ON TABLE "job_task" IS '任务实例'; + +CREATE TABLE job_task_batch +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + job_id BIGINT NOT NULL, + workflow_node_id BIGINT NOT NULL DEFAULT 0, + parent_workflow_node_id BIGINT NOT NULL DEFAULT 0, + workflow_task_batch_id BIGINT NOT NULL DEFAULT 0, + parent_id VARCHAR(64) NOT NULL DEFAULT '', + task_batch_status SMALLINT NOT NULL DEFAULT 0, + operation_reason SMALLINT NOT NULL DEFAULT 0, + execution_at BIGINT NOT NULL DEFAULT 0, + system_task_type SMALLINT NOT NULL DEFAULT 3, + ext_attrs VARCHAR(256) DEFAULT '', + deleted SMALLINT NOT NULL DEFAULT 0, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX "idx_namespace_id_group_name_to_job_task_batch" ON "job_task_batch" ("namespace_id", "group_name"); +CREATE INDEX "idx_job_id_task_batch_status_to_job_task_batch" ON "job_task_batch" ("job_id", "task_batch_status"); +CREATE INDEX "idx_create_dt_to_job_task_batch" ON "job_task_batch" ("create_dt"); +CREATE INDEX "idx_workflow_task_batch_id_workflow_node_id" ON "job_task_batch" ("workflow_task_batch_id", "workflow_node_id"); + +COMMENT ON COLUMN "job_task_batch"."id" IS '主键'; +COMMENT ON COLUMN "job_task_batch"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "job_task_batch"."group_name" IS '组名称'; +COMMENT ON COLUMN "job_task_batch"."job_id" IS '任务信息id'; +COMMENT ON COLUMN "job_task_batch"."task_batch_status" IS '任务批次状态 0、失败 1、成功'; +COMMENT ON COLUMN "job_task_batch"."operation_reason" IS '操作原因'; +COMMENT ON COLUMN "job_task_batch"."workflow_node_id" IS '工作流节点id'; +COMMENT ON COLUMN "job_task_batch"."parent_workflow_node_id" IS '父节点'; +COMMENT ON COLUMN "job_task_batch"."workflow_task_batch_id" IS '任务批次id'; +COMMENT ON COLUMN "job_task_batch"."system_task_type" IS '任务类型 0、系统任务 1、业务任务'; +COMMENT ON COLUMN "job_task_batch"."execution_at" IS '任务执行时间'; +COMMENT ON COLUMN "job_task_batch"."parent_id" IS '父节点'; +COMMENT ON COLUMN "job_task_batch"."deleted" IS '逻辑删除 1、删除'; +COMMENT ON COLUMN "job_task_batch"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "job_task_batch"."update_dt" IS '创建时间'; +COMMENT ON COLUMN "job_task_batch"."ext_attrs" IS '扩展字段'; +COMMENT ON TABLE "job_task" IS '任务批次'; + +CREATE TABLE job_notify_config +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + job_id BIGINT NOT NULL, + notify_status SMALLINT NOT NULL DEFAULT 0, + notify_type SMALLINT NOT NULL DEFAULT 0, + notify_attribute VARCHAR(512) NOT NULL, + notify_threshold INT NOT NULL DEFAULT 0, + notify_scene SMALLINT NOT NULL DEFAULT 0, + rate_limiter_status SMALLINT NOT NULL DEFAULT 0, + rate_limiter_threshold INT NOT NULL DEFAULT 0, + description VARCHAR(256) NOT NULL DEFAULT '', + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE INDEX idx_namespace_id_group_name_job_id_job_notify_config ON job_notify_config (namespace_id, group_name, job_id); + +COMMENT ON COLUMN "job_notify_config"."id" IS '主键'; +COMMENT ON COLUMN "job_task"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "job_notify_config"."group_name" IS '组名称'; +COMMENT ON COLUMN "job_notify_config"."job_id" IS '任务信息id'; +COMMENT ON COLUMN "job_notify_config"."notify_status" IS '通知状态 0、未启用 1、启用'; +COMMENT ON COLUMN "job_notify_config"."notify_type" IS '通知类型 1、钉钉 2、邮件 3、企业微信'; +COMMENT ON COLUMN "job_notify_config"."notify_attribute" IS '配置属性'; +COMMENT ON COLUMN "job_notify_config"."notify_threshold" IS '通知阈值'; +COMMENT ON COLUMN "job_notify_config"."notify_scene" IS '通知场景'; +COMMENT ON COLUMN "job_notify_config"."rate_limiter_status" IS '限流状态 0、未启用 1、启用'; +COMMENT ON COLUMN "job_notify_config"."rate_limiter_threshold" IS '每秒限流阈值'; +COMMENT ON COLUMN "job_notify_config"."description" IS '描述'; +COMMENT ON COLUMN "job_notify_config"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "job_notify_config"."update_dt" IS '修改时间'; +COMMENT ON TABLE "job_notify_config" IS '通知配置'; + +CREATE TABLE retry_summary +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL DEFAULT '', + scene_name VARCHAR(50) NOT NULL DEFAULT '', + trigger_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + running_num INT NOT NULL DEFAULT 0, + finish_num INT NOT NULL DEFAULT 0, + max_count_num INT NOT NULL DEFAULT 0, + suspend_num INT NOT NULL DEFAULT 0, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX uk_scene_name_trigger_at ON retry_summary ("namespace_id", "group_name", "scene_name", "trigger_at"); + +COMMENT ON COLUMN "retry_summary"."id" IS '主键'; +COMMENT ON COLUMN "retry_summary"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "retry_summary"."group_name" IS '组名称'; +COMMENT ON COLUMN "retry_summary"."scene_name" IS '场景名称'; +COMMENT ON COLUMN "retry_summary"."trigger_at" IS '统计时间'; +COMMENT ON COLUMN "retry_summary"."running_num" IS '重试中-日志数量'; +COMMENT ON COLUMN "retry_summary"."finish_num" IS '重试完成-日志数量'; +COMMENT ON COLUMN "retry_summary"."max_count_num" IS '重试到达最大次数-日志数量'; +COMMENT ON COLUMN "retry_summary"."suspend_num" IS '暂停重试-日志数量'; +COMMENT ON COLUMN "retry_summary"."create_dt" IS '创建时间'; +COMMENT ON COLUMN "retry_summary"."update_dt" IS '修改时间'; +COMMENT ON TABLE "retry_summary" IS 'DashBoard_Retry'; + +CREATE TABLE job_summary +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL DEFAULT '', + job_id BIGINT NOT NULL, + trigger_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + success_num INT NOT NULL DEFAULT 0, + fail_num INT NOT NULL DEFAULT 0, + fail_reason VARCHAR(512) NOT NULL DEFAULT '', + stop_num INT NOT NULL DEFAULT 0, + stop_reason VARCHAR(512) NOT NULL DEFAULT '', + cancel_num INT NOT NULL DEFAULT 0, + cancel_reason VARCHAR(512) NOT NULL DEFAULT '', + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE UNIQUE INDEX uk_job_id_trigger_at ON job_summary ("job_id", "trigger_at"); +CREATE INDEX idx_namespace_id_group_name_job_id ON job_summary ("namespace_id", "group_name", "job_id"); + +COMMENT ON COLUMN "job_summary"."id" IS '主键'; +COMMENT ON COLUMN "job_summary"."namespace_id" IS '命名空间id'; +COMMENT ON COLUMN "job_summary"."group_name" IS '组名称'; +COMMENT ON COLUMN "job_summary"."job_id" IS '任务信息id'; +COMMENT ON COLUMN "job_summary"."trigger_at" IS '统计时间'; +COMMENT ON COLUMN "job_summary"."success_num" IS '执行成功-日志数量'; +COMMENT ON COLUMN "job_summary"."fail_num" IS '执行失败-日志数量'; +COMMENT ON COLUMN "job_summary"."fail_reason" IS '失败原因'; +COMMENT ON COLUMN "job_summary"."stop_num" IS '执行失败-日志数量'; +COMMENT ON COLUMN "job_summary"."stop_reason" IS '失败原因'; +COMMENT ON COLUMN "job_summary"."cancel_num" IS '执行失败-日志数量'; +COMMENT ON COLUMN "job_summary"."cancel_reason" IS '失败原因'; +COMMENT ON TABLE "job_summary" IS 'DashBoard_Job'; + +CREATE TABLE workflow +( + id BIGSERIAL PRIMARY KEY, + workflow_name varchar(64) NOT NULL, + namespace_id varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name varchar(64) NOT NULL, + workflow_status smallint NOT NULL DEFAULT 1, + trigger_type smallint NOT NULL, + trigger_interval varchar(255) NOT NULL, + next_trigger_at BIGINT NOT NULL, + block_strategy smallint NOT NULL DEFAULT 1, + executor_timeout INT NOT NULL DEFAULT 0, + description varchar(256) NOT NULL DEFAULT '', + flow_info text DEFAULT NULL, + bucket_index INT NOT NULL DEFAULT 0, + version INT NOT NULL, + create_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted smallint NOT NULL DEFAULT 0, + ext_attrs varchar(256) NULL DEFAULT '' +); + + +CREATE INDEX idx_create_dt_workflow ON workflow (create_dt); +CREATE INDEX idx_namespace_id_group_name ON workflow (namespace_id, group_name); + +COMMENT ON TABLE workflow IS '工作流'; +COMMENT ON COLUMN workflow.id IS '主键'; +COMMENT ON COLUMN workflow.workflow_name IS '工作流名称'; +COMMENT ON COLUMN workflow.namespace_id IS '命名空间id'; +COMMENT ON COLUMN workflow.group_name IS '组名称'; +COMMENT ON COLUMN workflow.workflow_status IS '工作流状态 0、关闭、1、开启'; +COMMENT ON COLUMN workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间'; +COMMENT ON COLUMN workflow.trigger_interval IS '间隔时长'; +COMMENT ON COLUMN workflow.next_trigger_at IS '下次触发时间'; +COMMENT ON COLUMN workflow.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行'; +COMMENT ON COLUMN workflow.executor_timeout IS '任务执行超时时间,单位秒'; +COMMENT ON COLUMN workflow.description IS '描述'; +COMMENT ON COLUMN workflow.flow_info IS '流程信息'; +COMMENT ON COLUMN workflow.bucket_index IS 'bucket'; +COMMENT ON COLUMN workflow.version IS '版本号'; +COMMENT ON COLUMN workflow.create_dt IS '创建时间'; +COMMENT ON COLUMN workflow.update_dt IS '修改时间'; +COMMENT ON COLUMN workflow.deleted IS '逻辑删除 1、删除'; +COMMENT ON COLUMN workflow.ext_attrs IS '扩展字段'; + +CREATE TABLE workflow_node +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + node_name VARCHAR(64) NOT NULL, + group_name VARCHAR(64) NOT NULL, + job_id BIGINT NOT NULL, + workflow_id BIGINT NOT NULL, + node_type SMALLINT NOT NULL DEFAULT 1, + expression_type SMALLINT NOT NULL DEFAULT 0, + fail_strategy SMALLINT NOT NULL DEFAULT 1, + workflow_node_status SMALLINT NOT NULL DEFAULT 1, + priority_level INT NOT NULL DEFAULT 1, + node_info TEXT DEFAULT NULL, + version INT NOT NULL, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted SMALLINT NOT NULL DEFAULT 0, + ext_attrs VARCHAR(256) NULL DEFAULT '' +); + +CREATE INDEX idx_create_dt_workflow_node ON workflow_node (create_dt); +CREATE INDEX idx_namespace_id_group_name ON workflow_node (namespace_id, group_name); + +COMMENT ON TABLE workflow_node IS '工作流节点'; +COMMENT ON COLUMN workflow_node.id IS '主键'; +COMMENT ON COLUMN workflow_node.namespace_id IS '命名空间id'; +COMMENT ON COLUMN workflow_node.node_name IS '节点名称'; +COMMENT ON COLUMN workflow_node.group_name IS '组名称'; +COMMENT ON COLUMN workflow_node.job_id IS '任务信息id'; +COMMENT ON COLUMN workflow_node.workflow_id IS '工作流ID'; +COMMENT ON COLUMN workflow_node.node_type IS '1、任务节点 2、条件节点'; +COMMENT ON COLUMN workflow_node.expression_type IS '1、SpEl、2、Aviator 3、QL'; +COMMENT ON COLUMN workflow_node.fail_strategy IS '失败策略 1、跳过 2、阻塞'; +COMMENT ON COLUMN workflow_node.workflow_node_status IS '工作流节点状态 0、关闭、1、开启'; +COMMENT ON COLUMN workflow_node.priority_level IS '优先级'; +COMMENT ON COLUMN workflow_node.node_info IS '节点信息'; +COMMENT ON COLUMN workflow_node.version IS '版本号'; +COMMENT ON COLUMN workflow_node.create_dt IS '创建时间'; +COMMENT ON COLUMN workflow_node.update_dt IS '修改时间'; +COMMENT ON COLUMN workflow_node.deleted IS '逻辑删除 1、删除'; +COMMENT ON COLUMN workflow_node.ext_attrs IS '扩展字段'; + +CREATE TABLE workflow_task_batch +( + id BIGSERIAL PRIMARY KEY, + namespace_id VARCHAR(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a', + group_name VARCHAR(64) NOT NULL, + workflow_id BIGINT NOT NULL, + task_batch_status SMALLINT NOT NULL DEFAULT 0, + operation_reason SMALLINT NOT NULL DEFAULT 0, + flow_info TEXT DEFAULT NULL, + execution_at BIGINT NOT NULL DEFAULT 0, + create_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + update_dt TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + deleted SMALLINT NOT NULL DEFAULT 0, + ext_attrs VARCHAR(256) NULL DEFAULT '' +); + +CREATE INDEX idx_job_id_task_batch_status_workflow_task_batch ON workflow_task_batch (workflow_id, task_batch_status); +CREATE INDEX idx_create_dt_workflow_task_batch ON workflow_task_batch (create_dt); +CREATE INDEX idx_namespace_id_group_name_workflow_task_batch ON workflow_task_batch (namespace_id, group_name); + +COMMENT ON TABLE workflow_task_batch IS '工作流批次'; +COMMENT ON COLUMN workflow_task_batch.id IS '主键'; +COMMENT ON COLUMN workflow_task_batch.namespace_id IS '命名空间id'; +COMMENT ON COLUMN workflow_task_batch.group_name IS '组名称'; +COMMENT ON COLUMN workflow_task_batch.workflow_id IS '工作流任务id'; +COMMENT ON COLUMN workflow_task_batch.task_batch_status IS '任务批次状态 0、失败 1、成功'; +COMMENT ON COLUMN workflow_task_batch.operation_reason IS '操作原因'; +COMMENT ON COLUMN workflow_task_batch.flow_info IS '流程信息'; +COMMENT ON COLUMN workflow_task_batch.execution_at IS '任务执行时间'; +COMMENT ON COLUMN workflow_task_batch.create_dt IS '创建时间'; +COMMENT ON COLUMN workflow_task_batch.update_dt IS '修改时间'; +COMMENT ON COLUMN workflow_task_batch.deleted IS '逻辑删除 1、删除'; +COMMENT ON COLUMN workflow_task_batch.ext_attrs IS '扩展字段'; + + diff --git a/sql/postgres/postgres_ry_cloud.sql b/sql/postgres/postgres_ry_cloud.sql index 9c59e39ac..21636ac9e 100644 --- a/sql/postgres/postgres_ry_cloud.sql +++ b/sql/postgres/postgres_ry_cloud.sql @@ -445,6 +445,7 @@ insert into sys_menu values('108', '日志管理', '1', '9', 'log', insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', '1', '0', 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, now(), null, null, '在线用户菜单'); insert into sys_menu values('124', '缓存监控', '2', '1', 'cache', 'monitor/cache/index', '', '1', '0', 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, now(), null, null, '缓存监控'); insert into sys_menu values('110', 'PowerJob控制台', '2', '2', 'http://localhost:7700', '', '', '0', '0', 'C', '0', '0', 'monitor:job:list', 'job', 103, 1, now(), null, null, '定时任务菜单'); +insert into sys_menu values('116', 'EasyRetry控制台', '2', '2', 'http://localhost:8800', '', '', '0', '0', 'C', '0', '0', 'monitor:job:list', 'job', 103, 1, now(), null, null, 'ER定时任务菜单'); insert into sys_menu values('111', 'Sentinel控制台','2', '3', 'http://localhost:8718', '', '', '0', '0', 'C', '0', '0', 'monitor:sentinel:list', 'sentinel', 103, 1, now(), null, null, '流量控制菜单'); insert into sys_menu values('112', 'Nacos控制台', '2', '4', 'http://localhost:8848/nacos', '', '', '0', '0', 'C', '0', '0', 'monitor:nacos:list', 'nacos', 103, 1, now(), null, null, '服务治理菜单'); insert into sys_menu values('113', 'Admin控制台', '2', '5', 'http://localhost:9100/login', '', '', '0', '0', 'C', '0', '0', 'monitor:server:list', 'server', 103, 1, now(), null, null, '服务监控菜单'); diff --git a/sql/ry-cloud.sql b/sql/ry-cloud.sql index 753eeebda..599192723 100644 --- a/sql/ry-cloud.sql +++ b/sql/ry-cloud.sql @@ -282,6 +282,7 @@ insert into sys_menu values('108', '日志管理', '1', '9', 'log', insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, sysdate(), null, null, '在线用户菜单'); insert into sys_menu values('124', '缓存监控', '2', '1', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, sysdate(), null, null, '缓存监控'); insert into sys_menu values('110', 'PowerJob控制台', '2', '2', 'http://localhost:7700', '', '', 0, 0, 'C', '0', '0', 'monitor:job:list', 'job', 103, 1, sysdate(), null, null, '定时任务菜单'); +insert into sys_menu values('116', 'EasyRetry控制台', '2', '2', 'http://localhost:8800', '', '', 0, 0, 'C', '0', '0', 'monitor:job:list', 'job', 103, 1, sysdate(), null, null, 'ER定时任务菜单'); insert into sys_menu values('111', 'Sentinel控制台','2', '3', 'http://localhost:8718', '', '', 0, 0, 'C', '0', '0', 'monitor:sentinel:list', 'sentinel', 103, 1, sysdate(), null, null, '流量控制菜单'); insert into sys_menu values('112', 'Nacos控制台', '2', '4', 'http://localhost:8848/nacos', '', '', 0, 0, 'C', '0', '0', 'monitor:nacos:list', 'nacos', 103, 1, sysdate(), null, null, '服务治理菜单'); insert into sys_menu values('113', 'Admin控制台', '2', '5', 'http://localhost:9100/login', '', '', 0, 0, 'C', '0', '0', 'monitor:server:list', 'server', 103, 1, sysdate(), null, null, '服务监控菜单'); diff --git a/sql/ry-config.sql b/sql/ry-config.sql index b49d8aa8e..8ea4eced0 100644 --- a/sql/ry-config.sql +++ b/sql/ry-config.sql @@ -46,6 +46,7 @@ insert into config_info(id, data_id, group_id, content, md5, gmt_create, gmt_mod (11, 'ruoyi-powerjob-server.properties', 'DEFAULT_GROUP', '# 将项目路径:config/下对应文件中内容复制到此处', '2944a25cb97926efcaa43b3ad7a64cf0', '2022-01-09 15:21:02', '2022-01-09 15:21:02', NULL, '0:0:0:0:0:0:0:1', '', 'dev', '定时任务控制台', NULL, NULL, 'properties', NULL, ''), (12, 'seata-server.properties', 'DEFAULT_GROUP', '# 将项目路径:config/下对应文件中内容复制到此处', '2944a25cb97926efcaa43b3ad7a64cf0', '2022-01-09 15:21:02', '2022-01-09 15:21:02', NULL, '0:0:0:0:0:0:0:1', '', 'dev', 'seata配置文件', NULL, NULL, 'properties', NULL, ''), (13, 'ruoyi-sentinel-dashboard.yml', 'DEFAULT_GROUP', '# 将项目路径:config/下对应文件中内容复制到此处', '2944a25cb97926efcaa43b3ad7a64cf0', '2022-01-09 15:21:02', '2022-01-09 15:21:02', NULL, '0:0:0:0:0:0:0:1', '', 'dev', 'sentinel控制台配置文件', NULL, NULL, 'yaml', NULL, ''), +(14, 'ruoyi-easyretry-server.yml', 'DEFAULT_GROUP', '# 将项目路径:config/下对应文件中内容复制到此处', '2944a25cb97926efcaa43b3ad7a64cf0', '2022-01-09 15:21:02', '2022-01-09 15:21:02', NULL, '0:0:0:0:0:0:0:1', '', 'dev', 'ER定时任务控制台', NULL, NULL, 'yaml', NULL, ''), (101, 'application-common.yml', 'DEFAULT_GROUP', '# 将项目路径:config/下对应文件中内容复制到此处', '2944a25cb97926efcaa43b3ad7a64cf0', '2022-01-09 15:23:00', '2022-01-09 15:23:00', NULL, '0:0:0:0:0:0:0:1', '', 'prod', '通用配置基础配置', NULL, NULL, 'yaml', NULL, ''), (102, 'datasource.yml', 'DEFAULT_GROUP', '# 将项目路径:config/下对应文件中内容复制到此处', '2944a25cb97926efcaa43b3ad7a64cf0', '2022-01-09 15:23:00', '2022-01-09 15:23:00', NULL, '0:0:0:0:0:0:0:1', '', 'prod', '数据源配置', NULL, NULL, 'yaml', NULL, ''), @@ -60,6 +61,7 @@ insert into config_info(id, data_id, group_id, content, md5, gmt_create, gmt_mod (111, 'ruoyi-powerjob-server.properties', 'DEFAULT_GROUP', '# 将项目路径:config/下对应文件中内容复制到此处', '2944a25cb97926efcaa43b3ad7a64cf0', '2022-01-09 15:21:02', '2022-01-09 15:21:02', NULL, '0:0:0:0:0:0:0:1', '', 'prod', '定时任务控制台', NULL, NULL, 'properties', NULL, ''), (112, 'seata-server.properties', 'DEFAULT_GROUP', '# 将项目路径:config/下对应文件中内容复制到此处', '2944a25cb97926efcaa43b3ad7a64cf0', '2022-01-09 15:21:02', '2022-01-09 15:21:02', NULL, '0:0:0:0:0:0:0:1', '', 'prod', 'seata配置文件', NULL, NULL, 'properties', NULL, ''), (113, 'ruoyi-sentinel-dashboard.yml', 'DEFAULT_GROUP', '# 将项目路径:config/下对应文件中内容复制到此处', '2944a25cb97926efcaa43b3ad7a64cf0', '2022-01-09 15:21:02', '2022-01-09 15:21:02', NULL, '0:0:0:0:0:0:0:1', '', 'prod', 'sentinel控制台配置文件', NULL, NULL, 'yaml', NULL, ''); +(114, 'ruoyi-easyretry-server.yml', 'DEFAULT_GROUP', '# 将项目路径:config/下对应文件中内容复制到此处', '2944a25cb97926efcaa43b3ad7a64cf0', '2022-01-09 15:21:02', '2022-01-09 15:21:02', NULL, '0:0:0:0:0:0:0:1', '', 'dev', 'ER定时任务控制台', NULL, NULL, 'yaml', NULL, ''), /******************************************/ /* 表名称 = config_info_aggr */