From ac128a9ba51826c03bb281d3e5f0e388c1b0cf01 Mon Sep 17 00:00:00 2001 From: dhb52 Date: Sat, 1 Jun 2024 22:53:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=BE=BE=E6=A2=A6=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/docker/docker-compose.yaml | 24 + doc/sql/snail_job_dm8.sql | 821 ++++++++++++++++++ doc/tool/dbsync.py | 147 +++- pom.xml | 5 + snail-job-datasource/pom.xml | 1 + .../access/config/AbstractConfigAccess.java | 3 +- .../access/task/AbstractTaskAccess.java | 3 +- .../template/datasource/enums/DbTypeEnum.java | 3 +- .../snail-job-dm8-datasource/.gitignore | 35 + .../snail-job-dm8-datasource/pom.xml | 59 ++ .../dm/mapper/JobLogMessageMapper.xml | 25 + .../main/resources/dm/mapper/JobMapper.xml | 13 + .../resources/dm/mapper/JobSummaryMapper.xml | 94 ++ .../dm/mapper/RetryDeadLetterMapper.xml | 21 + .../dm/mapper/RetrySummaryMapper.xml | 99 +++ .../dm/mapper/RetryTaskLogMapper.xml | 19 + .../dm/mapper/RetryTaskLogMessageMapper.xml | 30 + .../resources/dm/mapper/RetryTaskMapper.xml | 26 + .../resources/dm/mapper/ServerNodeMapper.xml | 34 + .../resources/dm/mapper/WorkflowMapper.xml | 12 + .../common/enums/DashboardLineEnum.java | 2 +- .../lock/persistence/JdbcLockProvider.java | 3 +- .../src/main/resources/application.yml | 35 +- snail-job-server/snail-job-server-web/pom.xml | 4 + .../service/impl/GroupConfigServiceImpl.java | 47 +- 25 files changed, 1518 insertions(+), 47 deletions(-) create mode 100644 doc/sql/snail_job_dm8.sql create mode 100644 snail-job-datasource/snail-job-dm8-datasource/.gitignore create mode 100644 snail-job-datasource/snail-job-dm8-datasource/pom.xml create mode 100644 snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobLogMessageMapper.xml create mode 100644 snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobMapper.xml create mode 100644 snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobSummaryMapper.xml create mode 100644 snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryDeadLetterMapper.xml create mode 100644 snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetrySummaryMapper.xml create mode 100644 snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMapper.xml create mode 100644 snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMessageMapper.xml create mode 100644 snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskMapper.xml create mode 100644 snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/ServerNodeMapper.xml create mode 100644 snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/WorkflowMapper.xml diff --git a/doc/docker/docker-compose.yaml b/doc/docker/docker-compose.yaml index 8ddc67bd3..b76cfd943 100644 --- a/doc/docker/docker-compose.yaml +++ b/doc/docker/docker-compose.yaml @@ -6,6 +6,7 @@ volumes: postgres: { } sqlserver: { } mariadb: { } + dm8: { } services: mysql: @@ -84,3 +85,26 @@ services: - mariadb:/var/lib/mysql/ # 注入初始化脚本, mysql - ../sql/snail_job_mysql.sql:/docker-entrypoint-initdb.d/init.sql:ro + + + dm8: + # wget https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar + # docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar + image: dm8_single:dm8_20230808_rev197096_x86_rh6_64 + restart: unless-stopped + environment: + PAGE_SIZE: 16 + LD_LIBRARY_PATH: /opt/dmdbms/bin + EXTENT_SIZE: 32 + BLANK_PAD_MODE: 1 + LOG_SIZE: 1024 + UNICODE_FLAG: 1 + LENGTH_IN_CHAR: 1 + INSTANCE_NAME: dm8_test + ports: + - "5236:5236" + volumes: + - dm8:/opt/dmdbms/data + # docker compose exec dm8 bash -c "exec /opt/dmdbms/bin/disql SYSDBA/SYSDBA001 \`/tmp/schema.sql" + - ../sql/snail_job_dm8.sql:/tmp/schema.sql:ro + diff --git a/doc/sql/snail_job_dm8.sql b/doc/sql/snail_job_dm8.sql new file mode 100644 index 000000000..42498f78c --- /dev/null +++ b/doc/sql/snail_job_dm8.sql @@ -0,0 +1,821 @@ +/* + SnailJob Database Transfer Tool + Source Server Type : MySQL + Target Server Type : DM8 + Date: 2024-06-01 00:26:12 +*/ + + +-- sj_namespace +CREATE TABLE sj_namespace +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(64) NULL, + unique_id varchar(64) NULL, + description varchar(256) DEFAULT '' NULL, + deleted smallint DEFAULT 0 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_namespace_01 ON sj_namespace (name); + +COMMENT ON COLUMN sj_namespace.id IS '主键'; +COMMENT ON COLUMN sj_namespace.name IS '名称'; +COMMENT ON COLUMN sj_namespace.unique_id IS '唯一id'; +COMMENT ON COLUMN sj_namespace.description IS '描述'; +COMMENT ON COLUMN sj_namespace.deleted IS '逻辑删除 1、删除'; +COMMENT ON COLUMN sj_namespace.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_namespace.update_dt IS '修改时间'; +COMMENT ON TABLE sj_namespace IS '命名空间'; + +INSERT INTO sj_namespace (name, unique_id, create_dt, update_dt, deleted) +VALUES ('Default', '764d604ec6fc45f68cd92514c40e9e1a', sysdate, sysdate, 0); + +-- sj_group_config +CREATE TABLE sj_group_config +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) DEFAULT '' NULL, + description varchar(256) DEFAULT '' NULL, + token varchar(64) DEFAULT 'SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT' NULL, + group_status smallint DEFAULT 0 NOT NULL, + version int NOT NULL, + group_partition int NOT NULL, + id_generator_mode smallint DEFAULT 1 NOT NULL, + init_scene smallint DEFAULT 0 NOT NULL, + bucket_index int DEFAULT 0 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE UNIQUE INDEX uk_sj_group_config_01 ON sj_group_config (namespace_id, group_name); + +COMMENT ON COLUMN sj_group_config.id IS '主键'; +COMMENT ON COLUMN sj_group_config.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_group_config.group_name IS '组名称'; +COMMENT ON COLUMN sj_group_config.description IS '组描述'; +COMMENT ON COLUMN sj_group_config.token IS 'token'; +COMMENT ON COLUMN sj_group_config.group_status IS '组状态 0、未启用 1、启用'; +COMMENT ON COLUMN sj_group_config.version IS '版本号'; +COMMENT ON COLUMN sj_group_config.group_partition IS '分区'; +COMMENT ON COLUMN sj_group_config.id_generator_mode IS '唯一id生成模式 默认号段模式'; +COMMENT ON COLUMN sj_group_config.init_scene IS '是否初始化场景 0:否 1:是'; +COMMENT ON COLUMN sj_group_config.bucket_index IS 'bucket'; +COMMENT ON COLUMN sj_group_config.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_group_config.update_dt IS '修改时间'; +COMMENT ON TABLE sj_group_config IS '组配置'; + +-- sj_notify_config +CREATE TABLE sj_notify_config +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) NULL, + business_id varchar(64) NULL, + system_task_type smallint DEFAULT 3 NOT NULL, + notify_status smallint DEFAULT 0 NOT NULL, + recipient_ids varchar(128) NULL, + notify_threshold int DEFAULT 0 NOT NULL, + notify_scene smallint DEFAULT 0 NOT NULL, + rate_limiter_status smallint DEFAULT 0 NOT NULL, + rate_limiter_threshold int DEFAULT 0 NOT NULL, + description varchar(256) DEFAULT '' NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_notify_config_01 ON sj_notify_config (namespace_id, group_name, business_id); + +COMMENT ON COLUMN sj_notify_config.id IS '主键'; +COMMENT ON COLUMN sj_notify_config.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_notify_config.group_name IS '组名称'; +COMMENT ON COLUMN sj_notify_config.business_id IS '业务id ( job_id或workflow_id或scene_name ) '; +COMMENT ON COLUMN sj_notify_config.system_task_type IS '任务类型 1. 重试任务 2. 重试回调 3、JOB任务 4、WORKFLOW任务'; +COMMENT ON COLUMN sj_notify_config.notify_status IS '通知状态 0、未启用 1、启用'; +COMMENT ON COLUMN sj_notify_config.recipient_ids IS '接收人id列表'; +COMMENT ON COLUMN sj_notify_config.notify_threshold IS '通知阈值'; +COMMENT ON COLUMN sj_notify_config.notify_scene IS '通知场景'; +COMMENT ON COLUMN sj_notify_config.rate_limiter_status IS '限流状态 0、未启用 1、启用'; +COMMENT ON COLUMN sj_notify_config.rate_limiter_threshold IS '每秒限流阈值'; +COMMENT ON COLUMN sj_notify_config.description IS '描述'; +COMMENT ON COLUMN sj_notify_config.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_notify_config.update_dt IS '修改时间'; +COMMENT ON TABLE sj_notify_config IS '通知配置'; + +-- sj_notify_recipient +CREATE TABLE sj_notify_recipient +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + recipient_name varchar(64) NULL, + notify_type smallint DEFAULT 0 NOT NULL, + notify_attribute varchar(512) NULL, + description varchar(256) DEFAULT '' NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_notify_recipient_01 ON sj_notify_recipient (namespace_id); + +COMMENT ON COLUMN sj_notify_recipient.id IS '主键'; +COMMENT ON COLUMN sj_notify_recipient.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_notify_recipient.recipient_name IS '接收人名称'; +COMMENT ON COLUMN sj_notify_recipient.notify_type IS '通知类型 1、钉钉 2、邮件 3、企业微信 4 飞书 5 webhook'; +COMMENT ON COLUMN sj_notify_recipient.notify_attribute IS '配置属性'; +COMMENT ON COLUMN sj_notify_recipient.description IS '描述'; +COMMENT ON COLUMN sj_notify_recipient.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_notify_recipient.update_dt IS '修改时间'; +COMMENT ON TABLE sj_notify_recipient IS '告警通知接收人'; + +-- sj_retry_dead_letter_0 +CREATE TABLE sj_retry_dead_letter_0 +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + unique_id varchar(64) NULL, + group_name varchar(64) NULL, + scene_name varchar(64) NULL, + idempotent_id varchar(64) NULL, + biz_no varchar(64) DEFAULT '' NULL, + executor_name varchar(512) DEFAULT '' NULL, + args_str text NULL, + ext_attrs text NULL, + task_type smallint DEFAULT 1 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE UNIQUE INDEX uk_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, unique_id); + +CREATE INDEX idx_sj_retry_dead_letter_0_01 ON sj_retry_dead_letter_0 (namespace_id, group_name, scene_name); +CREATE INDEX idx_sj_retry_dead_letter_0_02 ON sj_retry_dead_letter_0 (idempotent_id); +CREATE INDEX idx_sj_retry_dead_letter_0_03 ON sj_retry_dead_letter_0 (biz_no); +CREATE INDEX idx_sj_retry_dead_letter_0_04 ON sj_retry_dead_letter_0 (create_dt); + +COMMENT ON COLUMN sj_retry_dead_letter_0.id IS '主键'; +COMMENT ON COLUMN sj_retry_dead_letter_0.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_retry_dead_letter_0.unique_id IS '同组下id唯一'; +COMMENT ON COLUMN sj_retry_dead_letter_0.group_name IS '组名称'; +COMMENT ON COLUMN sj_retry_dead_letter_0.scene_name IS '场景名称'; +COMMENT ON COLUMN sj_retry_dead_letter_0.idempotent_id IS '幂等id'; +COMMENT ON COLUMN sj_retry_dead_letter_0.biz_no IS '业务编号'; +COMMENT ON COLUMN sj_retry_dead_letter_0.executor_name IS '执行器名称'; +COMMENT ON COLUMN sj_retry_dead_letter_0.args_str IS '执行方法参数'; +COMMENT ON COLUMN sj_retry_dead_letter_0.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_retry_dead_letter_0.task_type IS '任务类型 1、重试数据 2、回调数据'; +COMMENT ON COLUMN sj_retry_dead_letter_0.create_dt IS '创建时间'; +COMMENT ON TABLE sj_retry_dead_letter_0 IS '死信队列表'; + +-- sj_retry_task_0 +CREATE TABLE sj_retry_task_0 +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + unique_id varchar(64) NULL, + group_name varchar(64) NULL, + scene_name varchar(64) NULL, + idempotent_id varchar(64) NULL, + biz_no varchar(64) DEFAULT '' NULL, + executor_name varchar(512) DEFAULT '' NULL, + args_str text NULL, + ext_attrs text NULL, + next_trigger_at datetime NOT NULL, + retry_count int DEFAULT 0 NOT NULL, + retry_status smallint DEFAULT 0 NOT NULL, + task_type smallint DEFAULT 1 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE UNIQUE INDEX uk_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, unique_id); + +CREATE INDEX idx_sj_retry_task_0_01 ON sj_retry_task_0 (namespace_id, group_name, scene_name); +CREATE INDEX idx_sj_retry_task_0_02 ON sj_retry_task_0 (namespace_id, group_name, task_type); +CREATE INDEX idx_sj_retry_task_0_03 ON sj_retry_task_0 (namespace_id, group_name, retry_status); +CREATE INDEX idx_sj_retry_task_0_04 ON sj_retry_task_0 (idempotent_id); +CREATE INDEX idx_sj_retry_task_0_05 ON sj_retry_task_0 (biz_no); +CREATE INDEX idx_sj_retry_task_0_06 ON sj_retry_task_0 (create_dt); + +COMMENT ON COLUMN sj_retry_task_0.id IS '主键'; +COMMENT ON COLUMN sj_retry_task_0.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_retry_task_0.unique_id IS '同组下id唯一'; +COMMENT ON COLUMN sj_retry_task_0.group_name IS '组名称'; +COMMENT ON COLUMN sj_retry_task_0.scene_name IS '场景名称'; +COMMENT ON COLUMN sj_retry_task_0.idempotent_id IS '幂等id'; +COMMENT ON COLUMN sj_retry_task_0.biz_no IS '业务编号'; +COMMENT ON COLUMN sj_retry_task_0.executor_name IS '执行器名称'; +COMMENT ON COLUMN sj_retry_task_0.args_str IS '执行方法参数'; +COMMENT ON COLUMN sj_retry_task_0.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_retry_task_0.next_trigger_at IS '下次触发时间'; +COMMENT ON COLUMN sj_retry_task_0.retry_count IS '重试次数'; +COMMENT ON COLUMN sj_retry_task_0.retry_status IS '重试状态 0、重试中 1、成功 2、最大重试次数'; +COMMENT ON COLUMN sj_retry_task_0.task_type IS '任务类型 1、重试数据 2、回调数据'; +COMMENT ON COLUMN sj_retry_task_0.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_retry_task_0.update_dt IS '修改时间'; +COMMENT ON TABLE sj_retry_task_0 IS '任务表'; + +-- sj_retry_task_log +CREATE TABLE sj_retry_task_log +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + unique_id varchar(64) NULL, + group_name varchar(64) NULL, + scene_name varchar(64) NULL, + idempotent_id varchar(64) NULL, + biz_no varchar(64) DEFAULT '' NULL, + executor_name varchar(512) DEFAULT '' NULL, + args_str text NULL, + ext_attrs text NULL, + retry_status smallint DEFAULT 0 NOT NULL, + task_type smallint DEFAULT 1 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_retry_task_log_01 ON sj_retry_task_log (namespace_id, group_name, scene_name); +CREATE INDEX idx_sj_retry_task_log_02 ON sj_retry_task_log (retry_status); +CREATE INDEX idx_sj_retry_task_log_03 ON sj_retry_task_log (idempotent_id); +CREATE INDEX idx_sj_retry_task_log_04 ON sj_retry_task_log (unique_id); +CREATE INDEX idx_sj_retry_task_log_05 ON sj_retry_task_log (biz_no); +CREATE INDEX idx_sj_retry_task_log_06 ON sj_retry_task_log (create_dt); + +COMMENT ON COLUMN sj_retry_task_log.id IS '主键'; +COMMENT ON COLUMN sj_retry_task_log.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_retry_task_log.unique_id IS '同组下id唯一'; +COMMENT ON COLUMN sj_retry_task_log.group_name IS '组名称'; +COMMENT ON COLUMN sj_retry_task_log.scene_name IS '场景名称'; +COMMENT ON COLUMN sj_retry_task_log.idempotent_id IS '幂等id'; +COMMENT ON COLUMN sj_retry_task_log.biz_no IS '业务编号'; +COMMENT ON COLUMN sj_retry_task_log.executor_name IS '执行器名称'; +COMMENT ON COLUMN sj_retry_task_log.args_str IS '执行方法参数'; +COMMENT ON COLUMN sj_retry_task_log.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_retry_task_log.retry_status IS '重试状态 0、重试中 1、成功 2、最大次数'; +COMMENT ON COLUMN sj_retry_task_log.task_type IS '任务类型 1、重试数据 2、回调数据'; +COMMENT ON COLUMN sj_retry_task_log.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_retry_task_log.update_dt IS '修改时间'; +COMMENT ON TABLE sj_retry_task_log IS '任务日志基础信息表'; + +-- sj_retry_task_log_message +CREATE TABLE sj_retry_task_log_message +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) NULL, + unique_id varchar(64) NULL, + message text NULL, + log_num int DEFAULT 1 NOT NULL, + real_time bigint DEFAULT 0 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_retry_task_log_message_01 ON sj_retry_task_log_message (namespace_id, group_name, unique_id); +CREATE INDEX idx_sj_retry_task_log_message_02 ON sj_retry_task_log_message (create_dt); + +COMMENT ON COLUMN sj_retry_task_log_message.id IS '主键'; +COMMENT ON COLUMN sj_retry_task_log_message.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_retry_task_log_message.group_name IS '组名称'; +COMMENT ON COLUMN sj_retry_task_log_message.unique_id IS '同组下id唯一'; +COMMENT ON COLUMN sj_retry_task_log_message.message IS '异常信息'; +COMMENT ON COLUMN sj_retry_task_log_message.log_num IS '日志数量'; +COMMENT ON COLUMN sj_retry_task_log_message.real_time IS '上报时间'; +COMMENT ON COLUMN sj_retry_task_log_message.create_dt IS '创建时间'; +COMMENT ON TABLE sj_retry_task_log_message IS '任务调度日志信息记录表'; + +-- sj_retry_scene_config +CREATE TABLE sj_retry_scene_config +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + scene_name varchar(64) NULL, + group_name varchar(64) NULL, + scene_status smallint DEFAULT 0 NOT NULL, + max_retry_count int DEFAULT 5 NOT NULL, + back_off smallint DEFAULT 1 NOT NULL, + trigger_interval varchar(16) DEFAULT '' NULL, + deadline_request bigint DEFAULT 60000 NOT NULL, + executor_timeout int DEFAULT 5 NOT NULL, + route_key smallint DEFAULT 4 NOT NULL, + description varchar(256) DEFAULT '' NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE UNIQUE INDEX uk_sj_retry_scene_config_01 ON sj_retry_scene_config (namespace_id, group_name, scene_name); + +COMMENT ON COLUMN sj_retry_scene_config.id IS '主键'; +COMMENT ON COLUMN sj_retry_scene_config.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_retry_scene_config.scene_name IS '场景名称'; +COMMENT ON COLUMN sj_retry_scene_config.group_name IS '组名称'; +COMMENT ON COLUMN sj_retry_scene_config.scene_status IS '组状态 0、未启用 1、启用'; +COMMENT ON COLUMN sj_retry_scene_config.max_retry_count IS '最大重试次数'; +COMMENT ON COLUMN sj_retry_scene_config.back_off IS '1、默认等级 2、固定间隔时间 3、CRON 表达式'; +COMMENT ON COLUMN sj_retry_scene_config.trigger_interval IS '间隔时长'; +COMMENT ON COLUMN sj_retry_scene_config.deadline_request IS 'Deadline Request 调用链超时 单位毫秒'; +COMMENT ON COLUMN sj_retry_scene_config.executor_timeout IS '任务执行超时时间,单位秒'; +COMMENT ON COLUMN sj_retry_scene_config.route_key IS '路由策略'; +COMMENT ON COLUMN sj_retry_scene_config.description IS '描述'; +COMMENT ON COLUMN sj_retry_scene_config.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_retry_scene_config.update_dt IS '修改时间'; +COMMENT ON TABLE sj_retry_scene_config IS '场景配置'; + +-- sj_server_node +CREATE TABLE sj_server_node +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) NULL, + host_id varchar(64) NULL, + host_ip varchar(64) NULL, + host_port int NOT NULL, + expire_at datetime NOT NULL, + node_type smallint NOT NULL, + ext_attrs varchar(256) DEFAULT '' NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE UNIQUE INDEX uk_sj_server_node_01 ON sj_server_node (host_id, host_ip); + +CREATE INDEX idx_sj_server_node_01 ON sj_server_node (namespace_id, group_name); +CREATE INDEX idx_sj_server_node_02 ON sj_server_node (expire_at, node_type); + +COMMENT ON COLUMN sj_server_node.id IS '主键'; +COMMENT ON COLUMN sj_server_node.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_server_node.group_name IS '组名称'; +COMMENT ON COLUMN sj_server_node.host_id IS '主机id'; +COMMENT ON COLUMN sj_server_node.host_ip IS '机器ip'; +COMMENT ON COLUMN sj_server_node.host_port IS '机器端口'; +COMMENT ON COLUMN sj_server_node.expire_at IS '过期时间'; +COMMENT ON COLUMN sj_server_node.node_type IS '节点类型 1、客户端 2、是服务端'; +COMMENT ON COLUMN sj_server_node.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_server_node.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_server_node.update_dt IS '修改时间'; +COMMENT ON TABLE sj_server_node IS '服务器节点'; + +-- sj_distributed_lock +CREATE TABLE sj_distributed_lock +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + name varchar(64) NULL, + lock_until timestamp(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL, + locked_at timestamp(3) DEFAULT CURRENT_TIMESTAMP(3) NOT NULL, + locked_by varchar(255) NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +COMMENT ON COLUMN sj_distributed_lock.id IS '主键'; +COMMENT ON COLUMN sj_distributed_lock.name IS '锁名称'; +COMMENT ON COLUMN sj_distributed_lock.lock_until IS '锁定时长'; +COMMENT ON COLUMN sj_distributed_lock.locked_at IS '锁定时间'; +COMMENT ON COLUMN sj_distributed_lock.locked_by IS '锁定者'; +COMMENT ON COLUMN sj_distributed_lock.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_distributed_lock.update_dt IS '修改时间'; +COMMENT ON TABLE sj_distributed_lock IS '锁定表'; + +-- sj_system_user +CREATE TABLE sj_system_user +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + username varchar(64) NULL, + password varchar(128) NULL, + role smallint DEFAULT 0 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +COMMENT ON COLUMN sj_system_user.id IS '主键'; +COMMENT ON COLUMN sj_system_user.username IS '账号'; +COMMENT ON COLUMN sj_system_user.password IS '密码'; +COMMENT ON COLUMN sj_system_user.role IS '角色:1-普通用户、2-管理员'; +COMMENT ON COLUMN sj_system_user.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_system_user.update_dt IS '修改时间'; +COMMENT ON TABLE sj_system_user IS '系统用户表'; + +INSERT INTO sj_system_user (username, password, role) +VALUES ('admin', '465c194afb65670f38322df087f0a9bb225cc257e43eb4ac5a0c98ef5b3173ac', 2); + +-- sj_system_user_permission +CREATE TABLE sj_system_user_permission +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + group_name varchar(64) NULL, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + system_user_id bigint NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE UNIQUE INDEX uk_sj_system_user_permission_01 ON sj_system_user_permission (namespace_id, group_name, system_user_id); + +COMMENT ON COLUMN sj_system_user_permission.id IS '主键'; +COMMENT ON COLUMN sj_system_user_permission.group_name IS '组名称'; +COMMENT ON COLUMN sj_system_user_permission.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_system_user_permission.system_user_id IS '系统用户id'; +COMMENT ON COLUMN sj_system_user_permission.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_system_user_permission.update_dt IS '修改时间'; +COMMENT ON TABLE sj_system_user_permission IS '系统用户权限表'; + +-- sj_sequence_alloc +CREATE TABLE sj_sequence_alloc +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) DEFAULT '' NULL, + max_id bigint DEFAULT 1 NOT NULL, + step int DEFAULT 100 NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE UNIQUE INDEX uk_sj_sequence_alloc_01 ON sj_sequence_alloc (namespace_id, group_name); + +COMMENT ON COLUMN sj_sequence_alloc.id IS '主键'; +COMMENT ON COLUMN sj_sequence_alloc.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_sequence_alloc.group_name IS '组名称'; +COMMENT ON COLUMN sj_sequence_alloc.max_id IS '最大id'; +COMMENT ON COLUMN sj_sequence_alloc.step IS '步长'; +COMMENT ON COLUMN sj_sequence_alloc.update_dt IS '更新时间'; +COMMENT ON TABLE sj_sequence_alloc IS '号段模式序号ID分配表'; + +-- sj_job +CREATE TABLE sj_job +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) NULL, + job_name varchar(64) NULL, + args_str text DEFAULT NULL NULL, + args_type smallint DEFAULT 1 NOT NULL, + next_trigger_at bigint NOT NULL, + job_status smallint DEFAULT 1 NOT NULL, + task_type smallint DEFAULT 1 NOT NULL, + route_key smallint DEFAULT 4 NOT NULL, + executor_type smallint DEFAULT 1 NOT NULL, + executor_info varchar(255) DEFAULT NULL NULL, + trigger_type smallint NOT NULL, + trigger_interval varchar(255) NULL, + block_strategy smallint DEFAULT 1 NOT NULL, + executor_timeout int DEFAULT 0 NOT NULL, + max_retry_times int DEFAULT 0 NOT NULL, + parallel_num int DEFAULT 1 NOT NULL, + retry_interval int DEFAULT 0 NOT NULL, + bucket_index int DEFAULT 0 NOT NULL, + resident smallint DEFAULT 0 NOT NULL, + description varchar(256) DEFAULT '' NULL, + ext_attrs varchar(256) DEFAULT '' NULL, + deleted smallint DEFAULT 0 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_job_01 ON sj_job (namespace_id, group_name); +CREATE INDEX idx_sj_job_02 ON sj_job (job_status, bucket_index); +CREATE INDEX idx_sj_job_03 ON sj_job (create_dt); + +COMMENT ON COLUMN sj_job.id IS '主键'; +COMMENT ON COLUMN sj_job.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_job.group_name IS '组名称'; +COMMENT ON COLUMN sj_job.job_name IS '名称'; +COMMENT ON COLUMN sj_job.args_str IS '执行方法参数'; +COMMENT ON COLUMN sj_job.args_type IS '参数类型 '; +COMMENT ON COLUMN sj_job.next_trigger_at IS '下次触发时间'; +COMMENT ON COLUMN sj_job.job_status IS '任务状态 0、关闭、1、开启'; +COMMENT ON COLUMN sj_job.task_type IS '任务类型 1、集群 2、广播 3、切片'; +COMMENT ON COLUMN sj_job.route_key IS '路由策略'; +COMMENT ON COLUMN sj_job.executor_type IS '执行器类型'; +COMMENT ON COLUMN sj_job.executor_info IS '执行器名称'; +COMMENT ON COLUMN sj_job.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间'; +COMMENT ON COLUMN sj_job.trigger_interval IS '间隔时长'; +COMMENT ON COLUMN sj_job.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行'; +COMMENT ON COLUMN sj_job.executor_timeout IS '任务执行超时时间,单位秒'; +COMMENT ON COLUMN sj_job.max_retry_times IS '最大重试次数'; +COMMENT ON COLUMN sj_job.parallel_num IS '并行数'; +COMMENT ON COLUMN sj_job.retry_interval IS '重试间隔 ( s ) '; +COMMENT ON COLUMN sj_job.bucket_index IS 'bucket'; +COMMENT ON COLUMN sj_job.resident IS '是否是常驻任务'; +COMMENT ON COLUMN sj_job.description IS '描述'; +COMMENT ON COLUMN sj_job.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_job.deleted IS '逻辑删除 1、删除'; +COMMENT ON COLUMN sj_job.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_job.update_dt IS '修改时间'; +COMMENT ON TABLE sj_job IS '任务信息'; + +-- sj_job_log_message +CREATE TABLE sj_job_log_message +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) NULL, + job_id bigint NOT NULL, + task_batch_id bigint NOT NULL, + task_id bigint NOT NULL, + message text NULL, + log_num int DEFAULT 1 NOT NULL, + real_time bigint DEFAULT 0 NOT NULL, + ext_attrs varchar(256) DEFAULT '' NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_job_log_message_01 ON sj_job_log_message (task_batch_id, task_id); +CREATE INDEX idx_sj_job_log_message_02 ON sj_job_log_message (create_dt); +CREATE INDEX idx_sj_job_log_message_03 ON sj_job_log_message (namespace_id, group_name); + +COMMENT ON COLUMN sj_job_log_message.id IS '主键'; +COMMENT ON COLUMN sj_job_log_message.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_job_log_message.group_name IS '组名称'; +COMMENT ON COLUMN sj_job_log_message.job_id IS '任务信息id'; +COMMENT ON COLUMN sj_job_log_message.task_batch_id IS '任务批次id'; +COMMENT ON COLUMN sj_job_log_message.task_id IS '调度任务id'; +COMMENT ON COLUMN sj_job_log_message.message IS '调度信息'; +COMMENT ON COLUMN sj_job_log_message.log_num IS '日志数量'; +COMMENT ON COLUMN sj_job_log_message.real_time IS '上报时间'; +COMMENT ON COLUMN sj_job_log_message.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_job_log_message.create_dt IS '创建时间'; +COMMENT ON TABLE sj_job_log_message IS '调度日志'; + +-- sj_job_task +CREATE TABLE sj_job_task +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) NULL, + job_id bigint NOT NULL, + task_batch_id bigint NOT NULL, + parent_id bigint DEFAULT 0 NOT NULL, + task_status smallint DEFAULT 0 NOT NULL, + retry_count int DEFAULT 0 NOT NULL, + client_info varchar(128) DEFAULT NULL NULL, + result_message text NULL, + args_str text DEFAULT NULL NULL, + args_type smallint DEFAULT 1 NOT NULL, + ext_attrs varchar(256) DEFAULT '' NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_job_task_01 ON sj_job_task (task_batch_id, task_status); +CREATE INDEX idx_sj_job_task_02 ON sj_job_task (create_dt); +CREATE INDEX idx_sj_job_task_03 ON sj_job_task (namespace_id, group_name); + +COMMENT ON COLUMN sj_job_task.id IS '主键'; +COMMENT ON COLUMN sj_job_task.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_job_task.group_name IS '组名称'; +COMMENT ON COLUMN sj_job_task.job_id IS '任务信息id'; +COMMENT ON COLUMN sj_job_task.task_batch_id IS '调度任务id'; +COMMENT ON COLUMN sj_job_task.parent_id IS '父执行器id'; +COMMENT ON COLUMN sj_job_task.task_status IS '执行的状态 0、失败 1、成功'; +COMMENT ON COLUMN sj_job_task.retry_count IS '重试次数'; +COMMENT ON COLUMN sj_job_task.client_info IS '客户端地址 clientId#ip:port'; +COMMENT ON COLUMN sj_job_task.result_message IS '执行结果'; +COMMENT ON COLUMN sj_job_task.args_str IS '执行方法参数'; +COMMENT ON COLUMN sj_job_task.args_type IS '参数类型 '; +COMMENT ON COLUMN sj_job_task.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_job_task.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_job_task.update_dt IS '修改时间'; +COMMENT ON TABLE sj_job_task IS '任务实例'; + +-- sj_job_task_batch +CREATE TABLE sj_job_task_batch +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) NULL, + job_id bigint NOT NULL, + workflow_node_id bigint DEFAULT 0 NOT NULL, + parent_workflow_node_id bigint DEFAULT 0 NOT NULL, + workflow_task_batch_id bigint DEFAULT 0 NOT NULL, + task_batch_status smallint DEFAULT 0 NOT NULL, + operation_reason smallint DEFAULT 0 NOT NULL, + execution_at bigint DEFAULT 0 NOT NULL, + system_task_type smallint DEFAULT 3 NOT NULL, + parent_id varchar(64) DEFAULT '' NULL, + ext_attrs varchar(256) DEFAULT '' NULL, + deleted smallint DEFAULT 0 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_job_task_batch_01 ON sj_job_task_batch (job_id, task_batch_status); +CREATE INDEX idx_sj_job_task_batch_02 ON sj_job_task_batch (create_dt); +CREATE INDEX idx_sj_job_task_batch_03 ON sj_job_task_batch (namespace_id, group_name); +CREATE INDEX idx_sj_job_task_batch_04 ON sj_job_task_batch (workflow_task_batch_id, workflow_node_id); + +COMMENT ON COLUMN sj_job_task_batch.id IS '主键'; +COMMENT ON COLUMN sj_job_task_batch.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_job_task_batch.group_name IS '组名称'; +COMMENT ON COLUMN sj_job_task_batch.job_id IS '任务id'; +COMMENT ON COLUMN sj_job_task_batch.workflow_node_id IS '工作流节点id'; +COMMENT ON COLUMN sj_job_task_batch.parent_workflow_node_id IS '工作流任务父批次id'; +COMMENT ON COLUMN sj_job_task_batch.workflow_task_batch_id IS '工作流任务批次id'; +COMMENT ON COLUMN sj_job_task_batch.task_batch_status IS '任务批次状态 0、失败 1、成功'; +COMMENT ON COLUMN sj_job_task_batch.operation_reason IS '操作原因'; +COMMENT ON COLUMN sj_job_task_batch.execution_at IS '任务执行时间'; +COMMENT ON COLUMN sj_job_task_batch.system_task_type IS '任务类型 3、JOB任务 4、WORKFLOW任务'; +COMMENT ON COLUMN sj_job_task_batch.parent_id IS '父节点'; +COMMENT ON COLUMN sj_job_task_batch.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_job_task_batch.deleted IS '逻辑删除 1、删除'; +COMMENT ON COLUMN sj_job_task_batch.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_job_task_batch.update_dt IS '修改时间'; +COMMENT ON TABLE sj_job_task_batch IS '任务批次'; + +-- sj_job_summary +CREATE TABLE sj_job_summary +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) DEFAULT '' NULL, + business_id bigint NOT NULL, + system_task_type smallint DEFAULT 3 NOT NULL, + trigger_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + success_num int DEFAULT 0 NOT NULL, + fail_num int DEFAULT 0 NOT NULL, + fail_reason varchar(512) DEFAULT '' NULL, + stop_num int DEFAULT 0 NOT NULL, + stop_reason varchar(512) DEFAULT '' NULL, + cancel_num int DEFAULT 0 NOT NULL, + cancel_reason varchar(512) DEFAULT '' NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE UNIQUE INDEX uk_sj_job_summary_01 ON sj_job_summary (trigger_at, system_task_type, business_id); + +CREATE INDEX idx_sj_job_summary_01 ON sj_job_summary (namespace_id, group_name, business_id); + +COMMENT ON COLUMN sj_job_summary.id IS '主键'; +COMMENT ON COLUMN sj_job_summary.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_job_summary.group_name IS '组名称'; +COMMENT ON COLUMN sj_job_summary.business_id IS '业务id ( job_id或workflow_id ) '; +COMMENT ON COLUMN sj_job_summary.system_task_type IS '任务类型 3、JOB任务 4、WORKFLOW任务'; +COMMENT ON COLUMN sj_job_summary.trigger_at IS '统计时间'; +COMMENT ON COLUMN sj_job_summary.success_num IS '执行成功-日志数量'; +COMMENT ON COLUMN sj_job_summary.fail_num IS '执行失败-日志数量'; +COMMENT ON COLUMN sj_job_summary.fail_reason IS '失败原因'; +COMMENT ON COLUMN sj_job_summary.stop_num IS '执行失败-日志数量'; +COMMENT ON COLUMN sj_job_summary.stop_reason IS '失败原因'; +COMMENT ON COLUMN sj_job_summary.cancel_num IS '执行失败-日志数量'; +COMMENT ON COLUMN sj_job_summary.cancel_reason IS '失败原因'; +COMMENT ON COLUMN sj_job_summary.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_job_summary.update_dt IS '修改时间'; +COMMENT ON TABLE sj_job_summary IS 'DashBoard_Job'; + +-- sj_retry_summary +CREATE TABLE sj_retry_summary +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) DEFAULT '' NULL, + scene_name varchar(50) DEFAULT '' NULL, + trigger_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + running_num int DEFAULT 0 NOT NULL, + finish_num int DEFAULT 0 NOT NULL, + max_count_num int DEFAULT 0 NOT NULL, + suspend_num int DEFAULT 0 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE UNIQUE INDEX uk_sj_retry_summary_01 ON sj_retry_summary (namespace_id, group_name, scene_name, trigger_at); + +CREATE INDEX idx_sj_retry_summary_01 ON sj_retry_summary (trigger_at); + +COMMENT ON COLUMN sj_retry_summary.id IS '主键'; +COMMENT ON COLUMN sj_retry_summary.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_retry_summary.group_name IS '组名称'; +COMMENT ON COLUMN sj_retry_summary.scene_name IS '场景名称'; +COMMENT ON COLUMN sj_retry_summary.trigger_at IS '统计时间'; +COMMENT ON COLUMN sj_retry_summary.running_num IS '重试中-日志数量'; +COMMENT ON COLUMN sj_retry_summary.finish_num IS '重试完成-日志数量'; +COMMENT ON COLUMN sj_retry_summary.max_count_num IS '重试到达最大次数-日志数量'; +COMMENT ON COLUMN sj_retry_summary.suspend_num IS '暂停重试-日志数量'; +COMMENT ON COLUMN sj_retry_summary.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_retry_summary.update_dt IS '修改时间'; +COMMENT ON TABLE sj_retry_summary IS 'DashBoard_Retry'; + +-- sj_workflow +CREATE TABLE sj_workflow +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + workflow_name varchar(64) NULL, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) NULL, + workflow_status smallint DEFAULT 1 NOT NULL, + trigger_type smallint NOT NULL, + trigger_interval varchar(255) NULL, + next_trigger_at bigint NOT NULL, + block_strategy smallint DEFAULT 1 NOT NULL, + executor_timeout int DEFAULT 0 NOT NULL, + description varchar(256) DEFAULT '' NULL, + flow_info text DEFAULT NULL NULL, + bucket_index int DEFAULT 0 NOT NULL, + version int NOT NULL, + ext_attrs varchar(256) DEFAULT '' NULL, + deleted smallint DEFAULT 0 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_workflow_01 ON sj_workflow (create_dt); +CREATE INDEX idx_sj_workflow_02 ON sj_workflow (namespace_id, group_name); + +COMMENT ON COLUMN sj_workflow.id IS '主键'; +COMMENT ON COLUMN sj_workflow.workflow_name IS '工作流名称'; +COMMENT ON COLUMN sj_workflow.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_workflow.group_name IS '组名称'; +COMMENT ON COLUMN sj_workflow.workflow_status IS '工作流状态 0、关闭、1、开启'; +COMMENT ON COLUMN sj_workflow.trigger_type IS '触发类型 1.CRON 表达式 2. 固定时间'; +COMMENT ON COLUMN sj_workflow.trigger_interval IS '间隔时长'; +COMMENT ON COLUMN sj_workflow.next_trigger_at IS '下次触发时间'; +COMMENT ON COLUMN sj_workflow.block_strategy IS '阻塞策略 1、丢弃 2、覆盖 3、并行'; +COMMENT ON COLUMN sj_workflow.executor_timeout IS '任务执行超时时间,单位秒'; +COMMENT ON COLUMN sj_workflow.description IS '描述'; +COMMENT ON COLUMN sj_workflow.flow_info IS '流程信息'; +COMMENT ON COLUMN sj_workflow.bucket_index IS 'bucket'; +COMMENT ON COLUMN sj_workflow.version IS '版本号'; +COMMENT ON COLUMN sj_workflow.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_workflow.deleted IS '逻辑删除 1、删除'; +COMMENT ON COLUMN sj_workflow.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_workflow.update_dt IS '修改时间'; +COMMENT ON TABLE sj_workflow IS '工作流'; + +-- sj_workflow_node +CREATE TABLE sj_workflow_node +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + node_name varchar(64) NULL, + group_name varchar(64) NULL, + job_id bigint NOT NULL, + workflow_id bigint NOT NULL, + node_type smallint DEFAULT 1 NOT NULL, + expression_type smallint DEFAULT 0 NOT NULL, + fail_strategy smallint DEFAULT 1 NOT NULL, + workflow_node_status smallint DEFAULT 1 NOT NULL, + priority_level int DEFAULT 1 NOT NULL, + node_info text DEFAULT NULL NULL, + version int NOT NULL, + ext_attrs varchar(256) DEFAULT '' NULL, + deleted smallint DEFAULT 0 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_workflow_node_01 ON sj_workflow_node (create_dt); +CREATE INDEX idx_sj_workflow_node_02 ON sj_workflow_node (namespace_id, group_name); + +COMMENT ON COLUMN sj_workflow_node.id IS '主键'; +COMMENT ON COLUMN sj_workflow_node.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_workflow_node.node_name IS '节点名称'; +COMMENT ON COLUMN sj_workflow_node.group_name IS '组名称'; +COMMENT ON COLUMN sj_workflow_node.job_id IS '任务信息id'; +COMMENT ON COLUMN sj_workflow_node.workflow_id IS '工作流ID'; +COMMENT ON COLUMN sj_workflow_node.node_type IS '1、任务节点 2、条件节点'; +COMMENT ON COLUMN sj_workflow_node.expression_type IS '1、SpEl、2、Aviator 3、QL'; +COMMENT ON COLUMN sj_workflow_node.fail_strategy IS '失败策略 1、跳过 2、阻塞'; +COMMENT ON COLUMN sj_workflow_node.workflow_node_status IS '工作流节点状态 0、关闭、1、开启'; +COMMENT ON COLUMN sj_workflow_node.priority_level IS '优先级'; +COMMENT ON COLUMN sj_workflow_node.node_info IS '节点信息 '; +COMMENT ON COLUMN sj_workflow_node.version IS '版本号'; +COMMENT ON COLUMN sj_workflow_node.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_workflow_node.deleted IS '逻辑删除 1、删除'; +COMMENT ON COLUMN sj_workflow_node.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_workflow_node.update_dt IS '修改时间'; +COMMENT ON TABLE sj_workflow_node IS '工作流节点'; + +-- sj_workflow_task_batch +CREATE TABLE sj_workflow_task_batch +( + id bigint NOT NULL PRIMARY KEY IDENTITY, + namespace_id varchar(64) DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' NULL, + group_name varchar(64) NULL, + workflow_id bigint NOT NULL, + task_batch_status smallint DEFAULT 0 NOT NULL, + operation_reason smallint DEFAULT 0 NOT NULL, + flow_info text DEFAULT NULL NULL, + execution_at bigint DEFAULT 0 NOT NULL, + ext_attrs varchar(256) DEFAULT '' NULL, + deleted smallint DEFAULT 0 NOT NULL, + create_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL, + update_dt datetime DEFAULT CURRENT_TIMESTAMP NOT NULL +); + +CREATE INDEX idx_sj_workflow_task_batch_01 ON sj_workflow_task_batch (workflow_id, task_batch_status); +CREATE INDEX idx_sj_workflow_task_batch_02 ON sj_workflow_task_batch (create_dt); +CREATE INDEX idx_sj_workflow_task_batch_03 ON sj_workflow_task_batch (namespace_id, group_name); + +COMMENT ON COLUMN sj_workflow_task_batch.id IS '主键'; +COMMENT ON COLUMN sj_workflow_task_batch.namespace_id IS '命名空间id'; +COMMENT ON COLUMN sj_workflow_task_batch.group_name IS '组名称'; +COMMENT ON COLUMN sj_workflow_task_batch.workflow_id IS '工作流任务id'; +COMMENT ON COLUMN sj_workflow_task_batch.task_batch_status IS '任务批次状态 0、失败 1、成功'; +COMMENT ON COLUMN sj_workflow_task_batch.operation_reason IS '操作原因'; +COMMENT ON COLUMN sj_workflow_task_batch.flow_info IS '流程信息'; +COMMENT ON COLUMN sj_workflow_task_batch.execution_at IS '任务执行时间'; +COMMENT ON COLUMN sj_workflow_task_batch.ext_attrs IS '扩展字段'; +COMMENT ON COLUMN sj_workflow_task_batch.deleted IS '逻辑删除 1、删除'; +COMMENT ON COLUMN sj_workflow_task_batch.create_dt IS '创建时间'; +COMMENT ON COLUMN sj_workflow_task_batch.update_dt IS '修改时间'; +COMMENT ON TABLE sj_workflow_task_batch IS '工作流批次'; + diff --git a/doc/tool/dbsync.py b/doc/tool/dbsync.py index 7b70be5f9..6dd06689f 100755 --- a/doc/tool/dbsync.py +++ b/doc/tool/dbsync.py @@ -626,13 +626,156 @@ GO return script +class DM8Convertor(Convertor): + def __init__(self, src): + super().__init__(src, "DM8") + + # if type == "varchar": + # return f"varchar2({size if size < 4000 else 4000})" + # if type in ("int", "int unsigned"): + # return "number" + # if type == "bigint" or type == "bigint unsigned": + # return "number" + # if type == "datetime": + # return "date" + # if type == "timestamp": + # return f"timestamp({size})" + # if type == "bit": + # return "number(1,0)" + # if type in ("tinyint", "smallint"): + # return "smallint" + # if type in ("text", "longtext"): + # return "clob" + # if type in ("blob", "mediumblob"): + # return "blob" + # if type == "decimal": + # return ( + # f"number({','.join(str(s) for s in size)})" if len(size) else "number" + # ) + + def translate_type(self, type: str, size: Optional[Union[int, Tuple[int]]]): + """类型转换""" + type = type.lower() + + if type == "varchar": + return f"varchar({size})" + if type in ("int", "int unsigned"): + return "int" + if type in ("bigint", "bigint unsigned"): + return "bigint" + if type == "datetime": + return "datetime" + if type == "timestamp": + return f"timestamp({size})" + if type == "bit": + return "bit" + if type in ("tinyint", "smallint"): + return "smallint" + if type in ("text", "longtext"): + return "text" + if type in ("blob", "mediumblob"): + return "blob" + if type == "decimal": + return ( + f"decimal({','.join(str(s) for s in size)})" if len(size) else "decimal" + ) + + def gen_create(self, ddl) -> str: + """生成 CREATE 语句""" + + def generate_column(col): + name = col["name"].lower() + if name == "id": + return "id bigint NOT NULL PRIMARY KEY IDENTITY" + + type = col["type"].lower() + full_type = self.translate_type(type, col["size"]) + nullable = "NULL" if col["nullable"] else "NOT NULL" + # Oracle的 INSERT '' 不能通过NOT NULL校验,因此对文字类型字段覆写为 NULL + nullable = "NULL" if type in ("varchar", "text", "longtext") else nullable + default = f"DEFAULT {col['default']}" if col["default"] is not None else "" + # Oracle 中 size 不能作为字段名 + field_name = '"size"' if name == "size" else name + # Oracle DEFAULT 定义在 NULLABLE 之前 + return f"{field_name} {full_type} {default} {nullable}" + + table_name = ddl["table_name"].lower() + columns = [f"{generate_column(col).strip()}" for col in ddl["columns"]] + field_def_list = ",\n ".join(columns) + script = f"""-- {table_name} +CREATE TABLE {table_name} ( + {field_def_list} +);""" + + # oracle INSERT '' 不能通过 NOT NULL 校验 + # script = script.replace("DEFAULT '' NOT NULL", "DEFAULT '' NULL") + + return script + + def gen_index(self, ddl: Dict) -> str: + return "\n".join(f"{script};" for script in self.index(ddl)) + + def gen_comment(self, table_ddl: Dict) -> str: + script = "" + for column in table_ddl["columns"]: + table_comment = column["comment"] + script += ( + f"COMMENT ON COLUMN {table_ddl['table_name']}.{column['name']} IS '{table_comment}';" + + "\n" + ) + + table_comment = table_ddl["comment"] + if table_comment: + script += ( + f"COMMENT ON TABLE {table_ddl['table_name']} IS '{table_comment}';\n" + ) + + return script + + def gen_pk(self, table_name: str) -> str: + """生成主键定义""" + return "" + + def gen_uk(self, table_ddl: Dict) -> str: + script = "" + uk_list = list(Convertor.unique_index(table_ddl)) + for idx, (table_name, _, uk_columns) in enumerate(uk_list, 1): + uk_name = f"uk_{table_name}_{idx:02d}" + script += f"CREATE UNIQUE INDEX {uk_name} ON {table_name} ({', '.join(uk_columns)});\n" + + return script + + def gen_index(self, ddl: Dict) -> str: + return "\n".join(f"{script};" for script in self.index(ddl)) + + def gen_insert(self, table_name: str) -> str: + """拷贝 INSERT 语句""" + inserts = [] + for insert_script in Convertor.inserts(table_name, self.content): + insert_script = ( + insert_script.replace("(id,", "(") + .replace("VALUES (1,", "VALUES (") + .replace("now(),", "sysdate,") + ) + inserts.append(insert_script) + + ## 生成 insert 脚本 + script = "" + if inserts: + inserts_lines = "\n".join(inserts) + script += f"""\n\n +{inserts_lines}""" + + return script + + def main(): parser = argparse.ArgumentParser(description="Snail Job Database Transfer Tool") parser.add_argument( "type", type=str, help="Target database type", - choices=["postgre", "oracle", "sqlserver"], + choices=["postgre", "oracle", "sqlserver", "dm8"], ) args = parser.parse_args() @@ -644,6 +787,8 @@ def main(): convertor = OracleConvertor(sql_file) elif args.type == "sqlserver": convertor = SQLServerConvertor(sql_file) + elif args.type == "dm8": + convertor = DM8Convertor(sql_file) else: raise NotImplementedError(f"Database type not supported: {args.type}") diff --git a/pom.xml b/pom.xml index e72ac3da4..0503ab951 100644 --- a/pom.xml +++ b/pom.xml @@ -101,6 +101,11 @@ snail-job-sqlserver-datasource ${revision} + + com.aizuda + snail-job-dm8-datasource + ${revision} + cn.hutool hutool-http diff --git a/snail-job-datasource/pom.xml b/snail-job-datasource/pom.xml index 3566194c2..8fdc5c690 100644 --- a/snail-job-datasource/pom.xml +++ b/snail-job-datasource/pom.xml @@ -26,6 +26,7 @@ snail-job-postgres-datasource snail-job-oracle-datasource snail-job-sqlserver-datasource + snail-job-dm8-datasource snail-job-datasource-template diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/config/AbstractConfigAccess.java b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/config/AbstractConfigAccess.java index b89704d9c..078756a90 100644 --- a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/config/AbstractConfigAccess.java +++ b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/config/AbstractConfigAccess.java @@ -48,7 +48,8 @@ public abstract class AbstractConfigAccess implements ConfigAccess { DbTypeEnum.MARIADB.getDb(), DbTypeEnum.POSTGRES.getDb(), DbTypeEnum.ORACLE.getDb(), - DbTypeEnum.SQLSERVER.getDb()); + DbTypeEnum.SQLSERVER.getDb(), + DbTypeEnum.DM.getDb()); protected DbTypeEnum getDbType() { return DbUtils.getDbType(); diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/task/AbstractTaskAccess.java b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/task/AbstractTaskAccess.java index 44f2a7983..76389eed2 100644 --- a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/task/AbstractTaskAccess.java +++ b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/access/task/AbstractTaskAccess.java @@ -22,7 +22,8 @@ public abstract class AbstractTaskAccess implements TaskAccess { DbTypeEnum.MARIADB.getDb(), DbTypeEnum.POSTGRES.getDb(), DbTypeEnum.ORACLE.getDb(), - DbTypeEnum.SQLSERVER.getDb()); + DbTypeEnum.SQLSERVER.getDb(), + DbTypeEnum.DM.getDb()); protected DbTypeEnum getDbType() { return DbUtils.getDbType(); diff --git a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/enums/DbTypeEnum.java b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/enums/DbTypeEnum.java index bbe44ed14..b300c4aee 100644 --- a/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/enums/DbTypeEnum.java +++ b/snail-job-datasource/snail-job-datasource-template/src/main/java/com/aizuda/snailjob/template/datasource/enums/DbTypeEnum.java @@ -19,7 +19,8 @@ public enum DbTypeEnum { MARIADB("mariadb", "MariaDB数据库", DbType.MARIADB), POSTGRES("postgresql", "Postgres数据库", DbType.POSTGRE_SQL), ORACLE("oracle", "Oracle数据库", DbType.ORACLE_12C), - SQLSERVER("sqlserver", "SQLServer数据库", DbType.SQL_SERVER); + SQLSERVER("sqlserver", "SQLServer数据库", DbType.SQL_SERVER), + DM("dm", "达梦数据库", DbType.DM); private final String db; private final String desc; diff --git a/snail-job-datasource/snail-job-dm8-datasource/.gitignore b/snail-job-datasource/snail-job-dm8-datasource/.gitignore new file mode 100644 index 000000000..a73f41410 --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/.gitignore @@ -0,0 +1,35 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +.flattened-pom.xml diff --git a/snail-job-datasource/snail-job-dm8-datasource/pom.xml b/snail-job-datasource/snail-job-dm8-datasource/pom.xml new file mode 100644 index 000000000..c0102cd19 --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + com.aizuda + snail-job-datasource + ${revision} + ../pom.xml + + + snail-job-dm8-datasource + snail-job-dm8-datasource + snail-job-dm8-datasource + jar + + + 17 + 8.1.3.62 + + + + + org.projectlombok + lombok + true + + + com.aizuda + snail-job-datasource-template + + + com.dameng + DmJdbcDriver18 + ${dameng.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + none + execute + + + + + repackage + + + + + + + + diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobLogMessageMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobLogMessageMapper.xml new file mode 100644 index 000000000..a3a0ab598 --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobLogMessageMapper.xml @@ -0,0 +1,25 @@ + + + + + + + INSERT INTO sj_job_log_message (namespace_id, group_name, job_id, task_batch_id, task_id, + log_num, message, create_dt, real_time) + VALUES + + ( + #{item.namespaceId}, + #{item.groupName}, + #{item.jobId}, + #{item.taskBatchId}, + #{item.taskId}, + #{item.logNum}, + #{item.message}, + #{item.createDt}, + #{item.realTime} + ) + + + + diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobMapper.xml new file mode 100644 index 000000000..17fa63baa --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobMapper.xml @@ -0,0 +1,13 @@ + + + + + + + UPDATE sj_job + SET next_trigger_at = #{item.nextTriggerAt} + WHERE id = #{item.id} + + + + diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobSummaryMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobSummaryMapper.xml new file mode 100644 index 000000000..bb3c94dc9 --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/JobSummaryMapper.xml @@ -0,0 +1,94 @@ + + + + + + INSERT INTO sj_job_summary (namespace_id, group_name, business_id, trigger_at, system_task_type, + success_num,fail_num,fail_reason,stop_num,stop_reason, cancel_num,cancel_reason) + VALUES + + ( + #{item.namespaceId}, + #{item.groupName}, + #{item.businessId}, + #{item.triggerAt}, + #{item.systemTaskType}, + #{item.successNum}, + #{item.failNum}, + #{item.failReason}, + #{item.stopNum}, + #{item.stopReason}, + #{item.cancelNum}, + #{item.cancelReason} + ) + + + + + + UPDATE sj_job_summary + SET success_num = #{item.successNum}, + fail_num = #{item.failNum}, + fail_reason = #{item.failReason}, + stop_num = #{item.stopNum}, + stop_reason = #{item.stopReason}, + cancel_num = #{item.cancelNum}, + cancel_reason = #{item.cancelReason} + WHERE system_task_type = #{item.systemTaskType} + AND business_id = #{item.businessId} + AND trigger_at = #{item.triggerAt} + + + + + + + + + + diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryDeadLetterMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryDeadLetterMapper.xml new file mode 100644 index 000000000..14525c135 --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryDeadLetterMapper.xml @@ -0,0 +1,21 @@ + + + + + + INSERT INTO sj_retry_dead_letter (namespace_id, unique_id, group_name, scene_name, + idempotent_id, biz_no, executor_name, args_str, + ext_attrs, create_dt) + VALUES + + ( + #{retryDeadLetter.namespaceId,jdbcType=VARCHAR}, #{retryDeadLetter.uniqueId,jdbcType=VARCHAR}, + #{retryDeadLetter.groupName,jdbcType=VARCHAR}, #{retryDeadLetter.sceneName,jdbcType=VARCHAR}, + #{retryDeadLetter.idempotentId,jdbcType=VARCHAR}, #{retryDeadLetter.bizNo,jdbcType=VARCHAR}, + #{retryDeadLetter.executorName,jdbcType=VARCHAR}, #{retryDeadLetter.argsStr,jdbcType=VARCHAR}, + #{retryDeadLetter.extAttrs,jdbcType=VARCHAR}, #{retryDeadLetter.createDt,jdbcType=TIMESTAMP} + ) + + + + diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetrySummaryMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetrySummaryMapper.xml new file mode 100644 index 000000000..616249e81 --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetrySummaryMapper.xml @@ -0,0 +1,99 @@ + + + + + + INSERT INTO sj_retry_summary (namespace_id, group_name, scene_name, trigger_at, + running_num, finish_num, max_count_num, suspend_num) + VALUES + + ( + #{item.namespaceId}, + #{item.groupName}, + #{item.sceneName}, + #{item.triggerAt}, + #{item.runningNum}, + #{item.finishNum}, + #{item.maxCountNum}, + #{item.suspendNum} + ) + + + + + + UPDATE sj_retry_summary + SET running_num = #{item.runningNum}, + finish_num = #{item.finishNum}, + max_count_num = #{item.maxCountNum}, + suspend_num = #{item.suspendNum} + WHERE trigger_at = #{item.triggerAt} + AND group_name = #{item.groupName} + AND namespace_id = #{item.namespaceId} + AND scene_name = #{item.sceneName} + + + + + + + + + + + + diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMapper.xml new file mode 100644 index 000000000..879dc1864 --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMapper.xml @@ -0,0 +1,19 @@ + + + + + + + INSERT INTO sj_retry_task_log (unique_id, group_name, scene_name, idempotent_id, biz_no, executor_name, + args_str, ext_attrs, task_type, create_dt, namespace_id) + VALUES + + ( + #{item.uniqueId}, #{item.groupName}, #{item.sceneName}, #{item.idempotentId}, + #{item.bizNo}, #{item.executorName}, #{item.argsStr}, #{item.extAttrs}, + #{item.taskType}, #{item.createDt}, #{item.namespaceId} + ) + + + + diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMessageMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMessageMapper.xml new file mode 100644 index 000000000..96ea4c4b1 --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskLogMessageMapper.xml @@ -0,0 +1,30 @@ + + + + + + INSERT INTO sj_retry_task_log_message (namespace_id, group_name, unique_id, log_num, message, + create_dt, real_time) + VALUES + + ( + #{item.namespaceId}, + #{item.groupName}, + #{item.uniqueId}, + #{item.logNum}, + #{item.message}, + #{item.createDt}, + #{item.realTime} + ) + + + + + + UPDATE sj_retry_task_log_message + SET message = #{item.message}, log_num = #{item.logNum} + WHERE id = #{item.id} + + + + diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskMapper.xml new file mode 100644 index 000000000..f0515fcbf --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/RetryTaskMapper.xml @@ -0,0 +1,26 @@ + + + + + + + INSERT INTO sj_retry_task (namespace_id, unique_id, group_name, scene_name, idempotent_id, biz_no, + executor_name, args_str, ext_attrs, next_trigger_at, task_type, retry_status, create_dt) + VALUES + + ( + #{item.namespaceId}, #{item.uniqueId}, #{item.groupName}, #{item.sceneName}, #{item.idempotentId}, + #{item.bizNo}, #{item.executorName}, #{item.argsStr}, #{item.extAttrs}, #{item.nextTriggerAt}, + #{item.taskType}, #{item.retryStatus}, #{item.createDt} + ) + + + + + + UPDATE sj_retry_task_${partition} + SET next_trigger_at = #{item.nextTriggerAt} + WHERE id = #{item.id} + + + diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/ServerNodeMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/ServerNodeMapper.xml new file mode 100644 index 000000000..421576027 --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/ServerNodeMapper.xml @@ -0,0 +1,34 @@ + + + + + + + INSERT INTO sj_server_node (namespace_id, group_name, host_id, host_ip, host_port, + expire_at, node_type, ext_attrs, create_dt) + VALUES + + ( + #{item.namespaceId,jdbcType=VARCHAR}, + #{item.groupName,jdbcType=VARCHAR}, + #{item.hostId,jdbcType=VARCHAR}, + #{item.hostIp,jdbcType=VARCHAR}, + #{item.hostPort,jdbcType=INTEGER}, + #{item.expireAt,jdbcType=TIMESTAMP}, + #{item.nodeType,jdbcType=TINYINT}, + #{item.extAttrs,jdbcType=VARCHAR}, + #{item.createDt,jdbcType=TIMESTAMP} + ) + + + + + + UPDATE sj_server_node + SET expire_at = #{item.expireAt} + WHERE host_id = #{item.hostId} + AND host_ip = #{item.hostIp} + + + + diff --git a/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/WorkflowMapper.xml b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/WorkflowMapper.xml new file mode 100644 index 000000000..54abf2cb2 --- /dev/null +++ b/snail-job-datasource/snail-job-dm8-datasource/src/main/resources/dm/mapper/WorkflowMapper.xml @@ -0,0 +1,12 @@ + + + + + + + UPDATE sj_workflow + SET next_trigger_at = #{item.nextTriggerAt} + WHERE id = #{item.id} + + + diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/DashboardLineEnum.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/DashboardLineEnum.java index 1956b6ff8..52ad272c6 100644 --- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/DashboardLineEnum.java +++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/enums/DashboardLineEnum.java @@ -63,7 +63,7 @@ public enum DashboardLineEnum { default: return "yyyy-MM-dd"; } - } else { // Oracle, Postgres + } else { // Oracle, Postgres, DM switch (mode) { case YEAR: return "yyyy-MM"; diff --git a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/lock/persistence/JdbcLockProvider.java b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/lock/persistence/JdbcLockProvider.java index 93092b4e7..940930911 100644 --- a/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/lock/persistence/JdbcLockProvider.java +++ b/snail-job-server/snail-job-server-common/src/main/java/com/aizuda/snailjob/server/common/lock/persistence/JdbcLockProvider.java @@ -45,7 +45,8 @@ public class JdbcLockProvider implements LockStorage, Lifecycle { DbTypeEnum.MARIADB.getDb(), DbTypeEnum.POSTGRES.getDb(), DbTypeEnum.ORACLE.getDb(), - DbTypeEnum.SQLSERVER.getDb()); + DbTypeEnum.SQLSERVER.getDb(), + DbTypeEnum.DM.getDb()); private final DistributedLockMapper distributedLockMapper; private final PlatformTransactionManager platformTransactionManager; diff --git a/snail-job-server/snail-job-server-starter/src/main/resources/application.yml b/snail-job-server/snail-job-server-starter/src/main/resources/application.yml index 650197ea6..ed43c6fc6 100644 --- a/snail-job-server/snail-job-server-starter/src/main/resources/application.yml +++ b/snail-job-server/snail-job-server-starter/src/main/resources/application.yml @@ -15,26 +15,31 @@ spring: url: jdbc:mysql://localhost:3306/snail_job?useSSL=false&characterEncoding=utf8&useUnicode=true username: root password: root - ## postgres - # driver-class-name: org.postgresql.Driver - # url: jdbc:postgresql://localhost:5432/snail_job?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true - # username: root - # password: root - ## Oracle - # driver-class-name: oracle.jdbc.OracleDriver - # url: jdbc:oracle:thin:@//localhost:1521/XEPDB1 - # username: snail_job - # password: SnailJob - ## SQL Server 注意:由于system_user为SQLServer系统函数,因此SQLServer需要启用前缀配置,请配置mybatis-plus.global-config.db-config.table-prefix: er_ - # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver - # url: jdbc:sqlserver://localhost:1433;DatabaseName=snail_job;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true - # username: SA - # password: SnailJob@24 + ## postgres + # driver-class-name: org.postgresql.Driver + # url: jdbc:postgresql://localhost:5432/snail_job?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true + # username: root + # password: root + ## Oracle + # driver-class-name: oracle.jdbc.OracleDriver + # url: jdbc:oracle:thin:@//localhost:1521/XEPDB1 + # username: snail_job + # password: SnailJob + ## SQL Server 注意:由于system_user为SQLServer系统函数,因此SQLServer需要启用前缀配置,请配置mybatis-plus.global-config.db-config.table-prefix: er_ + # driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver + # url: jdbc:sqlserver://localhost:1433;DatabaseName=snail_job;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true + # username: SA + # password: SnailJob@24 ## mariadb # driver-class-name: org.mariadb.jdbc.Driver # url: jdbc:mariadb://localhost:3308/snail_job?useSSL=false&characterEncoding=utf8&useUnicode=true # username: root # password: root + ## dm8 + # driver-class-name: dm.jdbc.driver.DmDriver + # url: jdbc:dm://127.0.0.1:5236 + # username: SYSDBA + # password: SYSDBA001 type: com.zaxxer.hikari.HikariDataSource hikari: connection-timeout: 30000 diff --git a/snail-job-server/snail-job-server-web/pom.xml b/snail-job-server/snail-job-server-web/pom.xml index 48e5eb2b5..612eeceea 100644 --- a/snail-job-server/snail-job-server-web/pom.xml +++ b/snail-job-server/snail-job-server-web/pom.xml @@ -63,6 +63,10 @@ com.aizuda snail-job-sqlserver-datasource + + com.aizuda + snail-job-dm8-datasource + org.mapstruct mapstruct diff --git a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java index de0a8bbe5..7b9ba0a9f 100644 --- a/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java +++ b/snail-job-server/snail-job-server-web/src/main/java/com/aizuda/snailjob/server/web/service/impl/GroupConfigServiceImpl.java @@ -359,42 +359,36 @@ public class GroupConfigServiceImpl implements GroupConfigService { @Override public List getTablePartitionList() { DataSource dataSource = jdbcTemplate.getDataSource(); - Connection connection = null; - try { - connection = dataSource.getConnection(); + try (Connection connection = dataSource.getConnection()) { String catalog = connection.getCatalog(); String schema = connection.getSchema(); String tableNamePattern = "sj_retry_task_%"; DbTypeEnum dbType = DbUtils.getDbType(); - if (DbTypeEnum.ORACLE.getDb().equals(dbType.getDb())) { + // Oracle, DM 查询表名大写 + if (DbTypeEnum.ORACLE.getDb().equals(dbType.getDb()) || DbTypeEnum.DM.getDb().equals(dbType.getDb())) { tableNamePattern = tableNamePattern.toUpperCase(); } DatabaseMetaData metaData = connection.getMetaData(); - ResultSet tables = metaData.getTables(catalog, schema, tableNamePattern, new String[]{"TABLE"}); + ResultSet tableRs = metaData.getTables(catalog, schema, tableNamePattern, new String[]{"TABLE"}); - // 输出表名 + // 获取表名 List tableList = new ArrayList<>(); - while (tables.next()) { - String tableName = tables.getString("TABLE_NAME"); + while (tableRs.next()) { + String tableName = tableRs.getString("TABLE_NAME"); tableList.add(tableName); } - return tableList.stream().map(ReUtil::getFirstNumber).filter(i -> - !Objects.isNull(i)).distinct() + return tableList.stream() + .map(ReUtil::getFirstNumber) + .filter(Objects::nonNull) + .distinct() .collect(Collectors.toList()); } catch (SQLException ignored) { - } finally { - if (Objects.nonNull(connection)) { - try { - connection.close(); - } catch (SQLException ignored) { - } - } } - return Lists.newArrayList(); + return Collections.emptyList(); } @Override @@ -411,7 +405,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { .in(GroupConfig::getGroupName, groupSet)); Assert.isTrue(CollUtil.isEmpty(configs), - () -> new SnailJobServerException("导入失败. 原因: 组{}已存在", StreamUtils.toSet(configs, GroupConfig::getGroupName))); + () -> new SnailJobServerException("导入失败. 原因: 组{}已存在", StreamUtils.toSet(configs, GroupConfig::getGroupName))); for (final GroupConfigRequestVO groupConfigRequestVO : requestList) { @@ -432,13 +426,13 @@ public class GroupConfigServiceImpl implements GroupConfigService { List allRequestList = Lists.newArrayList(); PartitionTaskUtils.process((startId -> { List groupConfigs = accessTemplate.getGroupConfigAccess().listPage(new PageDTO<>(0, 100), - new LambdaQueryWrapper() - .ge(GroupConfig::getId, startId) - .eq(GroupConfig::getNamespaceId, namespaceId) - .eq(Objects.nonNull(exportGroupVO.getGroupStatus()), GroupConfig::getGroupStatus, exportGroupVO.getGroupStatus()) - .in(CollUtil.isNotEmpty(exportGroupVO.getGroupIds()), GroupConfig::getId, exportGroupVO.getGroupIds()) - .likeRight(StrUtil.isNotBlank(exportGroupVO.getGroupName()), GroupConfig::getGroupName, StrUtil.trim(exportGroupVO.getGroupName())) - .orderByAsc(GroupConfig::getId) + new LambdaQueryWrapper() + .ge(GroupConfig::getId, startId) + .eq(GroupConfig::getNamespaceId, namespaceId) + .eq(Objects.nonNull(exportGroupVO.getGroupStatus()), GroupConfig::getGroupStatus, exportGroupVO.getGroupStatus()) + .in(CollUtil.isNotEmpty(exportGroupVO.getGroupIds()), GroupConfig::getId, exportGroupVO.getGroupIds()) + .likeRight(StrUtil.isNotBlank(exportGroupVO.getGroupName()), GroupConfig::getGroupName, StrUtil.trim(exportGroupVO.getGroupName())) + .orderByAsc(GroupConfig::getId) ).getRecords(); return groupConfigs.stream().map(GroupConfigPartitionTask::new).toList(); }), partitionTasks -> { @@ -455,6 +449,7 @@ public class GroupConfigServiceImpl implements GroupConfigService { private static class GroupConfigPartitionTask extends PartitionTask { // 这里就直接放GroupConfig为了后面若加字段不需要再这里在调整了 private final GroupConfig config; + public GroupConfigPartitionTask(@NotNull GroupConfig config) { this.config = config; setId(config.getId());