diff --git a/db/yami_shop.sql b/db/yami_shop.sql index 245ee79..1ef89ab 100644 --- a/db/yami_shop.sql +++ b/db/yami_shop.sql @@ -16,238 +16,6 @@ USE yami_shops; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -/*Table structure for table `qrtz_blob_triggers` */ - -/*Table structure for table `qrtz_blob_triggers` */ - -DROP TABLE IF EXISTS `qrtz_blob_triggers`; - -CREATE TABLE `qrtz_blob_triggers` ( - `SCHED_NAME` varchar(120) NOT NULL, - `TRIGGER_NAME` varchar(200) NOT NULL, - `TRIGGER_GROUP` varchar(200) NOT NULL, - `BLOB_DATA` blob, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - KEY `SCHED_NAME` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - CONSTRAINT `qrtz_blob_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_blob_triggers` */ - -/*Table structure for table `qrtz_calendars` */ - -DROP TABLE IF EXISTS `qrtz_calendars`; - -CREATE TABLE `qrtz_calendars` ( - `SCHED_NAME` varchar(120) NOT NULL, - `CALENDAR_NAME` varchar(200) NOT NULL, - `CALENDAR` blob NOT NULL, - PRIMARY KEY (`SCHED_NAME`,`CALENDAR_NAME`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_calendars` */ - -/*Table structure for table `qrtz_cron_triggers` */ - -DROP TABLE IF EXISTS `qrtz_cron_triggers`; - -CREATE TABLE `qrtz_cron_triggers` ( - `SCHED_NAME` varchar(120) NOT NULL, - `TRIGGER_NAME` varchar(200) NOT NULL, - `TRIGGER_GROUP` varchar(200) NOT NULL, - `CRON_EXPRESSION` varchar(120) NOT NULL, - `TIME_ZONE_ID` varchar(80) DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - CONSTRAINT `qrtz_cron_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_cron_triggers` */ - -insert into `qrtz_cron_triggers`(`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`CRON_EXPRESSION`,`TIME_ZONE_ID`) values -('clusteredScheduler','TASK_14','DEFAULT','0 * * * * ?','Asia/Shanghai'), -('clusteredScheduler','TASK_16','DEFAULT','0 0/5 * * * ?','Asia/Shanghai'); - -/*Table structure for table `qrtz_fired_triggers` */ - -DROP TABLE IF EXISTS `qrtz_fired_triggers`; - -CREATE TABLE `qrtz_fired_triggers` ( - `SCHED_NAME` varchar(120) NOT NULL, - `ENTRY_ID` varchar(95) NOT NULL, - `TRIGGER_NAME` varchar(200) NOT NULL, - `TRIGGER_GROUP` varchar(200) NOT NULL, - `INSTANCE_NAME` varchar(200) NOT NULL, - `FIRED_TIME` bigint(13) NOT NULL, - `SCHED_TIME` bigint(13) NOT NULL, - `PRIORITY` int(11) NOT NULL, - `STATE` varchar(16) NOT NULL, - `JOB_NAME` varchar(200) DEFAULT NULL, - `JOB_GROUP` varchar(200) DEFAULT NULL, - `IS_NONCONCURRENT` varchar(1) DEFAULT NULL, - `REQUESTS_RECOVERY` varchar(1) DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`,`ENTRY_ID`), - KEY `IDX_QRTZ_FT_TRIG_INST_NAME` (`SCHED_NAME`,`INSTANCE_NAME`), - KEY `IDX_QRTZ_FT_INST_JOB_REQ_RCVRY` (`SCHED_NAME`,`INSTANCE_NAME`,`REQUESTS_RECOVERY`), - KEY `IDX_QRTZ_FT_J_G` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), - KEY `IDX_QRTZ_FT_JG` (`SCHED_NAME`,`JOB_GROUP`), - KEY `IDX_QRTZ_FT_T_G` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - KEY `IDX_QRTZ_FT_TG` (`SCHED_NAME`,`TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_fired_triggers` */ - -/*Table structure for table `qrtz_job_details` */ - -DROP TABLE IF EXISTS `qrtz_job_details`; - -CREATE TABLE `qrtz_job_details` ( - `SCHED_NAME` varchar(120) NOT NULL, - `JOB_NAME` varchar(200) NOT NULL, - `JOB_GROUP` varchar(200) NOT NULL, - `DESCRIPTION` varchar(250) DEFAULT NULL, - `JOB_CLASS_NAME` varchar(250) NOT NULL, - `IS_DURABLE` varchar(1) NOT NULL, - `IS_NONCONCURRENT` varchar(1) NOT NULL, - `IS_UPDATE_DATA` varchar(1) NOT NULL, - `REQUESTS_RECOVERY` varchar(1) NOT NULL, - `JOB_DATA` blob, - PRIMARY KEY (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), - KEY `IDX_QRTZ_J_REQ_RECOVERY` (`SCHED_NAME`,`REQUESTS_RECOVERY`), - KEY `IDX_QRTZ_J_GRP` (`SCHED_NAME`,`JOB_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_job_details` */ - -insert into `qrtz_job_details`(`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`,`DESCRIPTION`,`JOB_CLASS_NAME`,`IS_DURABLE`,`IS_NONCONCURRENT`,`IS_UPDATE_DATA`,`REQUESTS_RECOVERY`,`JOB_DATA`) values -('clusteredScheduler','TASK_14','DEFAULT',NULL,'com.yami.shop.quartz.config.QuartzJob','0','1','0','0',''), -('clusteredScheduler','TASK_16','DEFAULT',NULL,'com.yami.shop.quartz.config.QuartzJob','0','1','0','0',''); - -/*Table structure for table `qrtz_locks` */ - -DROP TABLE IF EXISTS `qrtz_locks`; - -CREATE TABLE `qrtz_locks` ( - `SCHED_NAME` varchar(120) NOT NULL, - `LOCK_NAME` varchar(40) NOT NULL, - PRIMARY KEY (`SCHED_NAME`,`LOCK_NAME`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_locks` */ - -insert into `qrtz_locks`(`SCHED_NAME`,`LOCK_NAME`) values -('clusteredScheduler','STATE_ACCESS'), -('clusteredScheduler','TRIGGER_ACCESS'); - -/*Table structure for table `qrtz_paused_trigger_grps` */ - -DROP TABLE IF EXISTS `qrtz_paused_trigger_grps`; - -CREATE TABLE `qrtz_paused_trigger_grps` ( - `SCHED_NAME` varchar(120) NOT NULL, - `TRIGGER_GROUP` varchar(200) NOT NULL, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_paused_trigger_grps` */ - -/*Table structure for table `qrtz_scheduler_state` */ - -DROP TABLE IF EXISTS `qrtz_scheduler_state`; - -CREATE TABLE `qrtz_scheduler_state` ( - `SCHED_NAME` varchar(120) NOT NULL, - `INSTANCE_NAME` varchar(200) NOT NULL, - `LAST_CHECKIN_TIME` bigint(13) NOT NULL, - `CHECKIN_INTERVAL` bigint(13) NOT NULL, - PRIMARY KEY (`SCHED_NAME`,`INSTANCE_NAME`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_scheduler_state` */ - -/*Table structure for table `qrtz_simple_triggers` */ - -DROP TABLE IF EXISTS `qrtz_simple_triggers`; - -CREATE TABLE `qrtz_simple_triggers` ( - `SCHED_NAME` varchar(120) NOT NULL, - `TRIGGER_NAME` varchar(200) NOT NULL, - `TRIGGER_GROUP` varchar(200) NOT NULL, - `REPEAT_COUNT` bigint(7) NOT NULL, - `REPEAT_INTERVAL` bigint(12) NOT NULL, - `TIMES_TRIGGERED` bigint(10) NOT NULL, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - CONSTRAINT `qrtz_simple_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_simple_triggers` */ - -/*Table structure for table `qrtz_simprop_triggers` */ - -DROP TABLE IF EXISTS `qrtz_simprop_triggers`; - -CREATE TABLE `qrtz_simprop_triggers` ( - `SCHED_NAME` varchar(120) NOT NULL, - `TRIGGER_NAME` varchar(200) NOT NULL, - `TRIGGER_GROUP` varchar(200) NOT NULL, - `STR_PROP_1` varchar(512) DEFAULT NULL, - `STR_PROP_2` varchar(512) DEFAULT NULL, - `STR_PROP_3` varchar(512) DEFAULT NULL, - `INT_PROP_1` int(11) DEFAULT NULL, - `INT_PROP_2` int(11) DEFAULT NULL, - `LONG_PROP_1` bigint(20) DEFAULT NULL, - `LONG_PROP_2` bigint(20) DEFAULT NULL, - `DEC_PROP_1` decimal(13,4) DEFAULT NULL, - `DEC_PROP_2` decimal(13,4) DEFAULT NULL, - `BOOL_PROP_1` varchar(1) DEFAULT NULL, - `BOOL_PROP_2` varchar(1) DEFAULT NULL, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - CONSTRAINT `qrtz_simprop_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) REFERENCES `qrtz_triggers` (`SCHED_NAME`, `TRIGGER_NAME`, `TRIGGER_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_simprop_triggers` */ - -/*Table structure for table `qrtz_triggers` */ - -DROP TABLE IF EXISTS `qrtz_triggers`; - -CREATE TABLE `qrtz_triggers` ( - `SCHED_NAME` varchar(120) NOT NULL, - `TRIGGER_NAME` varchar(200) NOT NULL, - `TRIGGER_GROUP` varchar(200) NOT NULL, - `JOB_NAME` varchar(200) NOT NULL, - `JOB_GROUP` varchar(200) NOT NULL, - `DESCRIPTION` varchar(250) DEFAULT NULL, - `NEXT_FIRE_TIME` bigint(13) DEFAULT NULL, - `PREV_FIRE_TIME` bigint(13) DEFAULT NULL, - `PRIORITY` int(11) DEFAULT NULL, - `TRIGGER_STATE` varchar(16) NOT NULL, - `TRIGGER_TYPE` varchar(8) NOT NULL, - `START_TIME` bigint(13) NOT NULL, - `END_TIME` bigint(13) DEFAULT NULL, - `CALENDAR_NAME` varchar(200) DEFAULT NULL, - `MISFIRE_INSTR` smallint(2) DEFAULT NULL, - `JOB_DATA` blob, - PRIMARY KEY (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`), - KEY `IDX_QRTZ_T_J` (`SCHED_NAME`,`JOB_NAME`,`JOB_GROUP`), - KEY `IDX_QRTZ_T_JG` (`SCHED_NAME`,`JOB_GROUP`), - KEY `IDX_QRTZ_T_C` (`SCHED_NAME`,`CALENDAR_NAME`), - KEY `IDX_QRTZ_T_G` (`SCHED_NAME`,`TRIGGER_GROUP`), - KEY `IDX_QRTZ_T_STATE` (`SCHED_NAME`,`TRIGGER_STATE`), - KEY `IDX_QRTZ_T_N_STATE` (`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`), - KEY `IDX_QRTZ_T_N_G_STATE` (`SCHED_NAME`,`TRIGGER_GROUP`,`TRIGGER_STATE`), - KEY `IDX_QRTZ_T_NEXT_FIRE_TIME` (`SCHED_NAME`,`NEXT_FIRE_TIME`), - KEY `IDX_QRTZ_T_NFT_ST` (`SCHED_NAME`,`TRIGGER_STATE`,`NEXT_FIRE_TIME`), - KEY `IDX_QRTZ_T_NFT_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`), - KEY `IDX_QRTZ_T_NFT_ST_MISFIRE` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_STATE`), - KEY `IDX_QRTZ_T_NFT_ST_MISFIRE_GRP` (`SCHED_NAME`,`MISFIRE_INSTR`,`NEXT_FIRE_TIME`,`TRIGGER_GROUP`,`TRIGGER_STATE`), - CONSTRAINT `qrtz_triggers_ibfk_1` FOREIGN KEY (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) REFERENCES `qrtz_job_details` (`SCHED_NAME`, `JOB_NAME`, `JOB_GROUP`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -/*Data for the table `qrtz_triggers` */ - -insert into `qrtz_triggers`(`SCHED_NAME`,`TRIGGER_NAME`,`TRIGGER_GROUP`,`JOB_NAME`,`JOB_GROUP`,`DESCRIPTION`,`NEXT_FIRE_TIME`,`PREV_FIRE_TIME`,`PRIORITY`,`TRIGGER_STATE`,`TRIGGER_TYPE`,`START_TIME`,`END_TIME`,`CALENDAR_NAME`,`MISFIRE_INSTR`,`JOB_DATA`) values -('clusteredScheduler','TASK_14','DEFAULT','TASK_14','DEFAULT',NULL,1669166100000,1669166040000,5,'WAITING','CRON',1653270825000,0,NULL,1,''), -('clusteredScheduler','TASK_16','DEFAULT','TASK_16','DEFAULT',NULL,1669166100000,1669165800000,5,'WAITING','CRON',1653270869000,0,NULL,1,''); /*Table structure for table `tz_area` */ @@ -5052,8 +4820,6 @@ CREATE TABLE `tz_sys_log` ( /*Data for the table `tz_sys_log` */ insert into `tz_sys_log`(`id`,`username`,`operation`,`method`,`params`,`time`,`ip`,`create_date`) values -(829,'admin','保存定时任务','com.yami.shop.quartz.controller.ScheduleJobController.save()','{\"jobId\":14,\"beanName\":\"orderTask\",\"methodName\":\"cancelOrder\",\"cronExpression\":\"0 * * * * ?\",\"status\":0,\"remark\":\"取消超时未支付订单\",\"createTime\":\"2019-06-24T06:51:51.074+0000\"}',167,'127.0.0.1','2019-06-24 14:51:51'), -(830,'admin','保存定时任务','com.yami.shop.quartz.controller.ScheduleJobController.save()','{\"jobId\":16,\"beanName\":\"orderTask\",\"methodName\":\"confirmOrder\",\"cronExpression\":\"0 0/5 * * * ?\",\"status\":0,\"remark\":\"系统自动确认收货订单\",\"createTime\":\"2019-06-24T06:52:47.482+0000\"}',62,'127.0.0.1','2019-06-24 14:52:48'), (831,'admin','删除菜单','com.yami.shop.sys.controller.SysMenuController.delete()','168',8,'127.0.0.1','2019-06-26 14:04:22'), (832,'admin','删除菜单','com.yami.shop.sys.controller.SysMenuController.delete()','229',1,'127.0.0.1','2019-06-26 14:31:31'), (833,'admin','删除菜单','com.yami.shop.sys.controller.SysMenuController.delete()','231',6,'127.0.0.1','2019-06-26 14:31:37'), @@ -5065,10 +4831,7 @@ insert into `tz_sys_log`(`id`,`username`,`operation`,`method`,`params`,`time`,` (839,'admin','保存配置','com.yami.shop.sys.controller.SysConfigController.save()','{\"id\":1,\"paramKey\":\"测试\",\"paramValue\":\"1\",\"remark\":\"1\"}',17,'127.0.0.1','2019-07-03 08:57:59'), (840,'admin','删除配置','com.yami.shop.sys.controller.SysConfigController.delete()','[1]',18,'127.0.0.1','2019-07-03 08:58:20'), (841,'admin','新增公告管理','com.yami.shop.admin.controller.NoticeController.save()','{\"id\":4,\"shopId\":1,\"title\":\"测试\",\"content\":\"

1111

\",\"status\":1,\"isTop\":1,\"publishTime\":\"2019-07-03T02:05:55.730+0000\",\"updateTime\":\"2019-07-03T02:05:55.730+0000\"}',26,'127.0.0.1','2019-07-03 10:05:56'), -(842,'admin','删除公告管理','com.yami.shop.admin.controller.NoticeController.removeById()','4',37,'127.0.0.1','2019-07-03 20:00:24'), -(843,'admin','修改定时任务','com.yami.shop.quartz.controller.ScheduleJobController.update()','{\"jobId\":14,\"beanName\":\"orderTask\",\"methodName\":\"cancelOrder\",\"cronExpression\":\"0 * * * * ?\",\"status\":0,\"remark\":\"取消超时未支付订单\"}',50,'127.0.0.1','2019-08-07 17:01:52'), -(844,'admin','修改定时任务','com.yami.shop.quartz.controller.ScheduleJobController.update()','{\"jobId\":16,\"beanName\":\"orderTask\",\"methodName\":\"confirmOrder\",\"cronExpression\":\"0 0/5 * * * ?\",\"status\":0,\"remark\":\"系统自动确认收货订单\"}',18,'127.0.0.1','2019-08-07 17:01:57'), -(845,'admin','立即执行任务','com.yami.shop.quartz.controller.ScheduleJobController.run()','[14]',14,'127.0.0.1','2019-08-07 17:02:06'); +(842,'admin','删除公告管理','com.yami.shop.admin.controller.NoticeController.removeById()','4',37,'127.0.0.1','2019-07-03 20:00:24'); /*Table structure for table `tz_sys_menu` */ diff --git a/doc/README.md b/doc/README.md index af46639..e7ac35d 100644 --- a/doc/README.md +++ b/doc/README.md @@ -30,12 +30,13 @@ 以下版本是最低要求的!!! 提问问题前请注意开发环境!! -| 工具 | 版本 | -| ------ |------| -| jdk | 1.8+ | -| mysql | 5.7+ | -| redis | 4.0+ | -| nodejs | 8-12 | +| 工具 | 版本 | +|---------|-------| +| jdk | 1.8+ | +| mysql | 5.7+ | +| redis | 4.0+ | +| nodejs | 14-16 | +| xxl-job | 2.3.1 | ### 1.2 安装jdk + mysql + redis + maven @@ -54,11 +55,15 @@ - 推荐使用idea,安装lombok插件后,使用idea导入maven项目 - 将yami_shop.sql导入到mysql中,修改`application-dev.yml`更改 datasource.url、user、password -- 将mysql配置为不区分表名大小写 - 通过修改`shop.properties` 修改七牛云、阿里大于等信息 - 修改`api.properties` 修改当前接口所在域名,用于支付回调 - 启动redis,端口6379 - 通过`WebApplication`启动项目后台接口,`ApiApplication` 启动项目前端接口 +- xxl-job定时任务,通过github或者gitee下载xxl-job的已经打包好的源码,把 + + + + ## 3.vue开发环境安装 diff --git a/doc/基本框架设计/项目目录结构.md b/doc/基本框架设计/项目目录结构.md index a225035..6f3b316 100644 --- a/doc/基本框架设计/项目目录结构.md +++ b/doc/基本框架设计/项目目录结构.md @@ -8,7 +8,6 @@ yami-shops ├── yami-shop-api -- 前端(小程序)接口工程[8086] ├── yami-shop-bean -- 所有公共的实体类,商城基本流程所需的实体类 ├── yami-shop-common -- 前后台需要用到的公共配置,工具类等的集合地 -├── yami-shop-quartz -- 定时任务模块 ├── yami-shop-security -- oauth2.0 授权认证模块 ├── yami-shop-service -- 前后台需要用到的公共的、商城基本流程所需的service,dao的集合地 ├── yami-shop-sys -- 后台用户角色权限管理模块 diff --git a/doc/接口设计/必读.md b/doc/接口设计/必读.md index babb5fe..2659abe 100644 --- a/doc/接口设计/必读.md +++ b/doc/接口设计/必读.md @@ -1,8 +1,3 @@ 这里只有几点说明: 1. 这里写的是接口设计,如果你整个接口的接口文档,只需要启动api这个项目,然后访问 http://localhost:8086/doc.html - -2. 这里写的是如何设计,我们就不水接口文档几十页了好吧。 -3. 我们说了数据库基于b2b2c其实接口也是基于b2b2c,所以你才会在很多的接口的当中看到很多的`shop_id`。 -4. b2b2c和b2c的接口设计,很多情况下,也就是多了一个`shop_id`而已。 - diff --git a/doc/生产环境/docker/centos jdk安装.md b/doc/生产环境/centos jdk安装.md similarity index 100% rename from doc/生产环境/docker/centos jdk安装.md rename to doc/生产环境/centos jdk安装.md diff --git a/doc/生产环境/教你如何部署.md b/doc/生产环境/教你如何部署.md index c6714c5..31d84a3 100644 --- a/doc/生产环境/教你如何部署.md +++ b/doc/生产环境/教你如何部署.md @@ -35,12 +35,12 @@ yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel 7. 将两个jar上传到centos环境中 -8. 在生产环境中运行时候,需要使用`-Dspring.profiles.active=prod` ,在使用admin这个工程项目于生产环境的时候要添加定时任务的配置如`-Dspring.profiles.active=prod,quartz`,运行: +8. 在生产环境中运行时候,需要使用`-Dspring.profiles.active=prod` ,在使用admin这个工程项目于生产环境的时候要添加定时任务的配置如`-Dspring.profiles.active=prod`,运行: ```bash nohup java -jar -Dspring.profiles.active=prod "${jarPath}/${jarName}" > "${jarPath}/log/${moduleName}-console.log" & -nohup java -jar -Dspring.profiles.active=prod,quartz "${jarPath}/${jarName}" > "${jarPath}/log/${moduleName}-console.log" & +nohup java -jar -Dspring.profiles.active=prod "${jarPath}/${jarName}" > "${jarPath}/log/${moduleName}-console.log" & ``` - 替换`${jarPath}` 为`jar` 所在路径 @@ -60,7 +60,7 @@ tail -f ${PROJECT_PATH}/log/api.log 10. 使用nginx将请求指向特定的端口。 - +11. 关于定时任务,请使用xxl-job,看`XxlJobConfig`的配置说明 ### 2.vue diff --git a/pom.xml b/pom.xml index 7272397..be71195 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,6 @@ yami-shop-bean yami-shop-service yami-shop-security - yami-shop-quartz @@ -41,6 +40,8 @@ 2.12.1 2.17.2 3.0.3 + 2.3.1 + 3.1.1 @@ -144,6 +145,16 @@ transmittable-thread-local ${transmittable-thread-local.version} + + com.xuxueli + xxl-job-core + ${xxl-job.version} + + + org.springframework.cloud + spring-cloud-commons + ${spring-cloud-commons.version} + diff --git a/yami-shop-admin/Dockerfile b/yami-shop-admin/Dockerfile index 2c18000..88163d1 100644 --- a/yami-shop-admin/Dockerfile +++ b/yami-shop-admin/Dockerfile @@ -12,4 +12,4 @@ ADD ./yami-shop-admin/target/yami-shop-admin-0.0.1-SNAPSHOT.jar ./ EXPOSE 8085 -CMD java -jar -Xms512m -Xmx512m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -Dspring.profiles.active=docker,quartz yami-shop-admin-0.0.1-SNAPSHOT.jar \ No newline at end of file +CMD java -jar -Xms512m -Xmx512m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -Dspring.profiles.active=docker yami-shop-admin-0.0.1-SNAPSHOT.jar \ No newline at end of file diff --git a/yami-shop-admin/pom.xml b/yami-shop-admin/pom.xml index 6140292..2182d71 100644 --- a/yami-shop-admin/pom.xml +++ b/yami-shop-admin/pom.xml @@ -32,9 +32,12 @@ ${yami.shop.version} - com.yami.shop - yami-shop-quartz - ${yami.shop.version} + com.xuxueli + xxl-job-core + + + org.springframework.cloud + spring-cloud-commons diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/config/XxlJobConfig.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/config/XxlJobConfig.java new file mode 100644 index 0000000..17452fa --- /dev/null +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/config/XxlJobConfig.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. + * + * https://www.mall4j.com/ + * + * 未经允许,不可做商业用途! + * + * 版权所有,侵权必究! + */ +package com.yami.shop.admin.config; + +import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.commons.util.InetUtils; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * xxl-job config + * 为啥这里的代码要注释掉,因为很奇怪的,因为很多人都不会去下载xxl-job来跑定时任务。 + * 原本用spring 的 quartz做定时任务的,但是文档写着要忽略数据库大小写,结果很多人根本不看文档,所以干脆就把这个quartz的删掉,然后通过xxl-job执行定时任务 + * 那么又会带来一个问题,大家也不会看文档,也不会去下载xxl-job,所以要把这里面的代码注掉,要是有人需要的话,改下这里的连接配置,连上xxl-job即可。 + * 毕竟你都能找到这个文件了,下载xxl-job,修改并启动xxl-job-admin,把取消订单,确认收货之类定时任务加入到里面即可咯。还要把下面的注释掉的代码打开,这样启动项目就会连接xxl-job执行定时任务了。 + * @author FrozenWatermelon + * @date 2021/1/18 + */ +@Configuration +public class XxlJobConfig { + private final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); + + @Value("${xxl-job.admin.addresses}") + private String adminAddresses; + + @Value("${xxl-job.accessToken}") + private String accessToken; + + @Value("${xxl-job.logPath}") + private String logPath; + + @Value("${server.port}") + private int port; + + @Autowired + private InetUtils inetUtils; + +// @Bean +// public XxlJobSpringExecutor xxlJobExecutor() { +// +// logger.info(">>>>>>>>>>> xxl-job config init."); +// XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); +// xxlJobSpringExecutor.setAdminAddresses(adminAddresses); +// xxlJobSpringExecutor.setAppname("mall4j"); +// // 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP +// xxlJobSpringExecutor.setIp(inetUtils.findFirstNonLoopbackAddress().getHostAddress()); +// xxlJobSpringExecutor.setPort(port + 1000); +// xxlJobSpringExecutor.setAccessToken(accessToken); +// xxlJobSpringExecutor.setLogPath(logPath); +// xxlJobSpringExecutor.setLogRetentionDays(3); +// return xxlJobSpringExecutor; +// } + +} diff --git a/yami-shop-admin/src/main/java/com/yami/shop/admin/task/OrderTask.java b/yami-shop-admin/src/main/java/com/yami/shop/admin/task/OrderTask.java index 03ea2e5..4e8c558 100644 --- a/yami-shop-admin/src/main/java/com/yami/shop/admin/task/OrderTask.java +++ b/yami-shop-admin/src/main/java/com/yami/shop/admin/task/OrderTask.java @@ -13,6 +13,7 @@ package com.yami.shop.admin.task; import java.util.Date; import java.util.List; +import com.xxl.job.core.handler.annotation.XxlJob; import com.yami.shop.service.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,7 +30,11 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; - +/** + * @author FrozenWatermelon + * 定时任务的配置,请查看xxl-job的java配置文件。 + * @see com.yami.shop.admin.config.XxlJobConfig + */ @Component("orderTask") public class OrderTask { @@ -43,6 +48,7 @@ public class OrderTask { @Autowired private SkuService skuService; + @XxlJob("cancelOrder") public void cancelOrder(){ Date now = new Date(); logger.info("取消超时未支付订单。。。"); @@ -64,6 +70,7 @@ public class OrderTask { /** * 确认收货 */ + @XxlJob("confirmOrder") public void confirmOrder(){ Date now = new Date(); logger.info("系统自动确认收货订单。。。"); diff --git a/yami-shop-admin/src/main/resources/application-dev.yml b/yami-shop-admin/src/main/resources/application-dev.yml index 65da3e6..6378b93 100644 --- a/yami-shop-admin/src/main/resources/application-dev.yml +++ b/yami-shop-admin/src/main/resources/application-dev.yml @@ -22,3 +22,8 @@ spring: config: classpath:redisson/redisson.yml logging: config: classpath:logback/logback-dev.xml +xxl-job: + accessToken: default_token + logPath: /data/applogs/xxl-job/jobhandler + admin: + addresses: http://localhost:8080/xxl-job-admin \ No newline at end of file diff --git a/yami-shop-admin/src/main/resources/application-docker.yml b/yami-shop-admin/src/main/resources/application-docker.yml index 93b5a7a..78a6a00 100644 --- a/yami-shop-admin/src/main/resources/application-docker.yml +++ b/yami-shop-admin/src/main/resources/application-docker.yml @@ -18,3 +18,8 @@ spring: config: classpath:redisson/redisson-docker.yml logging: config: classpath:logback/logback-prod.xml +xxl-job: + accessToken: default_token + logPath: /data/applogs/xxl-job/jobhandler + admin: + addresses: http://localhost:8080/xxl-job-admin \ No newline at end of file diff --git a/yami-shop-admin/src/main/resources/application-prod.yml b/yami-shop-admin/src/main/resources/application-prod.yml index 05652c6..bfa8e0b 100644 --- a/yami-shop-admin/src/main/resources/application-prod.yml +++ b/yami-shop-admin/src/main/resources/application-prod.yml @@ -18,3 +18,8 @@ spring: config: classpath:redisson/redisson.yml logging: config: classpath:logback/logback-prod.xml +xxl-job: + accessToken: default_token + logPath: /data/applogs/xxl-job/jobhandler + admin: + addresses: http://localhost:8080/xxl-job-admin \ No newline at end of file diff --git a/yami-shop-admin/src/main/resources/application.yml b/yami-shop-admin/src/main/resources/application.yml index c74b904..ddea8ae 100644 --- a/yami-shop-admin/src/main/resources/application.yml +++ b/yami-shop-admin/src/main/resources/application.yml @@ -1,7 +1,7 @@ spring: - # 环境 dev|test|prod quart定时任务 + # 环境 dev|test|prod profiles: - active: dev,quartz + active: dev #文件上传设置 servlet: multipart: diff --git a/yami-shop-quartz/pom.xml b/yami-shop-quartz/pom.xml deleted file mode 100644 index 944f36b..0000000 --- a/yami-shop-quartz/pom.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - yami-shop - com.yami.shop - 0.0.1-SNAPSHOT - - 4.0.0 - - yami-shop-quartz - - - - org.quartz-scheduler - quartz - - - com.yami.shop - yami-shop-service - ${yami.shop.version} - - - com.yami.shop - yami-shop-security-admin - ${yami.shop.version} - - - \ No newline at end of file diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzCustomizerConfig.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzCustomizerConfig.java deleted file mode 100644 index 0cc1026..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzCustomizerConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.config; - -import org.springframework.boot.autoconfigure.quartz.SchedulerFactoryBeanCustomizer; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.quartz.SchedulerFactoryBean; - -/** - */ -@Configuration -public class QuartzCustomizerConfig implements SchedulerFactoryBeanCustomizer { - @Override - public void customize(SchedulerFactoryBean schedulerFactoryBean) { - schedulerFactoryBean.setWaitForJobsToCompleteOnShutdown(true); - } -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzJob.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzJob.java deleted file mode 100644 index 999ae0e..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/QuartzJob.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.config; - -import com.yami.shop.quartz.event.ScheduleJobEvent; -import com.yami.shop.quartz.model.ScheduleJob; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.quartz.DisallowConcurrentExecution; -import org.quartz.Job; -import org.quartz.JobExecutionContext; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.scheduling.annotation.EnableAsync; - -/** - * 该类将会被org.springframework.scheduling.quartz.SpringBeanJobFactory 实例化 - * 并使@Autowired 生效 - */ -@Slf4j -@DisallowConcurrentExecution -public class QuartzJob implements Job { - - @Autowired - private ApplicationEventPublisher publisher; - - /** - * 任务调度参数key - */ - public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY"; - - @Override - @SneakyThrows - public void execute(JobExecutionContext jobExecutionContext) { - ScheduleJob sysJob = (ScheduleJob) jobExecutionContext.getMergedJobDataMap().get(JOB_PARAM_KEY); - publisher.publishEvent(new ScheduleJobEvent(sysJob)); - } - -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/ScheduleManager.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/ScheduleManager.java deleted file mode 100644 index d0c8225..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/config/ScheduleManager.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.config; - -import com.yami.shop.quartz.enums.ScheduleStatus; -import com.yami.shop.quartz.model.ScheduleJob; -import lombok.AllArgsConstructor; -import org.quartz.*; -import org.springframework.stereotype.Component; - -/** - * 定时任务工具类 - * - * @author lgh - */ -@Component -@AllArgsConstructor -public class ScheduleManager { - private final static String JOB_NAME = "TASK_"; - - private final Scheduler scheduler; - - /** - * 获取触发器key - */ - private TriggerKey getTriggerKey(ScheduleJob scheduleJob) { - return TriggerKey.triggerKey(JOB_NAME + scheduleJob.getJobId()); - } - - /** - * 获取jobKey - */ - private JobKey getJobKey(ScheduleJob scheduleJob) { - return JobKey.jobKey(JOB_NAME + scheduleJob.getJobId()); - } - - /** - * 获取表达式触发器 - */ - public CronTrigger getCronTrigger(ScheduleJob scheduleJob) { - try { - return (CronTrigger) scheduler.getTrigger(getTriggerKey(scheduleJob)); - } catch (SchedulerException e) { - throw new RuntimeException("获取定时任务CronTrigger出现异常", e); - } - } - - /** - * 创建定时任务 - */ - public void createScheduleJob(ScheduleJob scheduleJob) { - try { - //构建job信息 - JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).withIdentity(getJobKey(scheduleJob)).build(); - - //表达式调度构建器,可以根据scheduleJob修改withMisfireHandling方法,但是使用异步执行定时任务,没必要 - CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()) - .withMisfireHandlingInstructionFireAndProceed(); - - //按新的cronExpression表达式构建一个新的trigger - CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob)).withSchedule(scheduleBuilder).build(); - - //放入参数,运行时的方法可以获取 - jobDetail.getJobDataMap().put(QuartzJob.JOB_PARAM_KEY, scheduleJob); - - scheduler.scheduleJob(jobDetail, trigger); - - //暂停任务 - if (scheduleJob.getStatus().equals(ScheduleStatus.PAUSE.getType())) { - pauseJob(scheduleJob); - } - } catch (SchedulerException e) { - throw new RuntimeException("创建定时任务失败", e); - } - } - - /** - * 更新定时任务 - */ - public void updateScheduleJob(ScheduleJob scheduleJob) { - try { - TriggerKey triggerKey = getTriggerKey(scheduleJob); - - //表达式调度构建器 - CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()).withMisfireHandlingInstructionFireAndProceed(); - - CronTrigger trigger = getCronTrigger(scheduleJob); - - // 如果定时任务不存在,则创建定时任务 - if (trigger == null) { - createScheduleJob(scheduleJob); - return; - } - - //按新的cronExpression表达式重新构建trigger - trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); - - //参数 - trigger.getJobDataMap().put(QuartzJob.JOB_PARAM_KEY, scheduleJob); - - scheduler.rescheduleJob(triggerKey, trigger); - - //暂停任务 - if (scheduleJob.getStatus().equals(ScheduleStatus.PAUSE.getType())) { - pauseJob(scheduleJob); - } - - } catch (SchedulerException e) { - throw new RuntimeException("更新定时任务失败", e); - } - } - - /** - * 立即执行任务 - */ - public void run(ScheduleJob scheduleJob) { - try { - //参数 - JobDataMap dataMap = new JobDataMap(); - dataMap.put(QuartzJob.JOB_PARAM_KEY, scheduleJob); - - scheduler.triggerJob(getJobKey(scheduleJob), dataMap); - } catch (SchedulerException e) { - throw new RuntimeException("立即执行定时任务失败", e); - } - } - - /** - * 暂停任务 - */ - public void pauseJob(ScheduleJob scheduleJob) { - try { - scheduler.pauseJob(getJobKey(scheduleJob)); - } catch (SchedulerException e) { - throw new RuntimeException("暂停定时任务失败", e); - } - } - - /** - * 恢复任务 - */ - public void resumeJob(ScheduleJob scheduleJob) { - try { - scheduler.resumeJob(getJobKey(scheduleJob)); - } catch (SchedulerException e) { - throw new RuntimeException("恢复定时任务失败", e); - } - } - - /** - * 删除定时任务 - */ - public void deleteScheduleJob(ScheduleJob scheduleJob) { - try { - // 停止触发器 - scheduler.pauseTrigger(getTriggerKey(scheduleJob)); - //移除触发器 - scheduler.unscheduleJob(getTriggerKey(scheduleJob)); - //删除任务 - scheduler.deleteJob(getJobKey(scheduleJob)); - } catch (SchedulerException e) { - throw new RuntimeException("删除定时任务失败", e); - } - } - -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobController.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobController.java deleted file mode 100644 index 8e12466..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobController.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.controller; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.yami.shop.common.annotation.SysLog; -import com.yami.shop.common.exception.YamiShopBindException; -import com.yami.shop.common.util.PageParam; -import com.yami.shop.quartz.model.ScheduleJob; -import com.yami.shop.quartz.service.ScheduleJobService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - - - -/** - * 定时任务 - * @author lgh - */ -@Slf4j -@RestController -@RequestMapping("/sys/schedule") -public class ScheduleJobController { - @Autowired - private ScheduleJobService scheduleJobService; - - /** - * 定时任务列表 - */ - @GetMapping("/page") - @PreAuthorize("@pms.hasPermission('sys:schedule:page')") - public ResponseEntity> page(String beanName,PageParam page){ - IPage scheduleJobs = scheduleJobService.page(page,new LambdaQueryWrapper().like(StrUtil.isNotBlank(beanName),ScheduleJob::getBeanName,beanName)); - return ResponseEntity.ok(scheduleJobs); - } - - /** - * 定时任务信息 - */ - @GetMapping("/info/{jobId}") - @PreAuthorize("@pms.hasPermission('sys:schedule:info')") - public ResponseEntity info(@PathVariable("jobId") Long jobId){ - ScheduleJob schedule = scheduleJobService.getById(jobId); - return ResponseEntity.ok(schedule); - } - - /** - * 保存定时任务 - */ - @SysLog("保存定时任务") - @PostMapping - @PreAuthorize("@pms.hasPermission('sys:schedule:save')") - public ResponseEntity save(@RequestBody @Valid ScheduleJob scheduleJob){ - - int dbAlikeCount = scheduleJobService.count(new LambdaQueryWrapper().eq(ScheduleJob::getBeanName, scheduleJob.getBeanName()).eq(ScheduleJob::getMethodName, scheduleJob.getMethodName())); - if (dbAlikeCount > 0) { - throw new YamiShopBindException("定时任务已存在"); - } - - scheduleJobService.saveAndStart(scheduleJob); - return ResponseEntity.ok().build(); - } - - /** - * 修改定时任务 - */ - @SysLog("修改定时任务") - @PutMapping - @PreAuthorize("@pms.hasPermission('sys:schedule:update')") - public ResponseEntity update(@RequestBody @Valid ScheduleJob scheduleJob){ - - int dbAlikeCount = scheduleJobService.count(new LambdaQueryWrapper().eq(ScheduleJob::getBeanName, scheduleJob.getBeanName()).eq(ScheduleJob::getMethodName, scheduleJob.getMethodName()).ne(ScheduleJob::getJobId,scheduleJob.getJobId())); - if (dbAlikeCount > 0) { - throw new YamiShopBindException("定时任务已存在"); - } - - scheduleJobService.updateScheduleJob(scheduleJob); - - return ResponseEntity.ok().build(); - } - - /** - * 删除定时任务 - */ - @SysLog("删除定时任务") - @DeleteMapping - @PreAuthorize("@pms.hasPermission('sys:schedule:delete')") - public ResponseEntity delete(@RequestBody Long[] jobIds){ - scheduleJobService.deleteBatch(jobIds); - return ResponseEntity.ok().build(); - } - - /** - * 立即执行任务 - */ - @SysLog("立即执行任务") - @PostMapping("/run") - @PreAuthorize("@pms.hasPermission('sys:schedule:run')") - public ResponseEntity run(@RequestBody Long[] jobIds){ - scheduleJobService.run(jobIds); - return ResponseEntity.ok().build(); - } - - /** - * 暂停定时任务 - */ - @SysLog("暂停定时任务") - @PostMapping("/pause") - @PreAuthorize("@pms.hasPermission('sys:schedule:pause')") - public ResponseEntity pause(@RequestBody Long[] jobIds){ - scheduleJobService.pause(jobIds); - return ResponseEntity.ok().build(); - } - - /** - * 恢复定时任务 - */ - @SysLog("恢复定时任务") - @PostMapping("/resume") - @PreAuthorize("@pms.hasPermission('sys:schedule:resume')") - public ResponseEntity resume(@RequestBody Long[] jobIds){ - scheduleJobService.resume(jobIds); - return ResponseEntity.ok().build(); - } - -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobLogController.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobLogController.java deleted file mode 100644 index f61d23f..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/controller/ScheduleJobLogController.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.controller; - - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.yami.shop.quartz.model.ScheduleJobLog; -import com.yami.shop.quartz.service.ScheduleJobLogService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - - -import com.yami.shop.common.util.PageParam; -import com.baomidou.mybatisplus.core.metadata.IPage; - -/** - * 定时任务日志 - * @author lgh - */ -@RestController -@RequestMapping("/sys/scheduleLog") -public class ScheduleJobLogController { - @Autowired - private ScheduleJobLogService scheduleJobLogService; - - /** - * 定时任务日志列表 - */ - @GetMapping("/page") - @PreAuthorize("@pms.hasPermission('sys:schedule:log')") - public ResponseEntity> page(Long jobId,PageParam page){ - IPage list = scheduleJobLogService.page(page,new LambdaQueryWrapper().eq(jobId != null,ScheduleJobLog::getJobId,jobId)); - return ResponseEntity.ok(list); - } -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobLogMapper.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobLogMapper.java deleted file mode 100644 index 1ad4a15..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobLogMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.dao; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yami.shop.quartz.model.ScheduleJobLog; - -public interface ScheduleJobLogMapper extends BaseMapper { - -} \ No newline at end of file diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobMapper.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobMapper.java deleted file mode 100644 index 0e911a9..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/dao/ScheduleJobMapper.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.dao; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.yami.shop.quartz.model.ScheduleJob; -import org.apache.ibatis.annotations.Param; - -/** - * 定时任务,任务调度mapper - * @author lgh - */ -public interface ScheduleJobMapper extends BaseMapper { - - /** - * 批量修改任务状态 - * @param jobIds 调度任务id - * @param status 任务状态 - * @return 修改成功条数 - */ - int updateBatch(@Param("jobIds") Long[] jobIds, @Param("status") int status); -} \ No newline at end of file diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/enums/ScheduleStatus.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/enums/ScheduleStatus.java deleted file mode 100644 index a3a147f..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/enums/ScheduleStatus.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum ScheduleStatus { - - /** - * 正常 - */ - NORMAL(0), - /** - * 暂停 - */ - PAUSE(1); - - /** - * 类型 - */ - private final Integer type; -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/event/ScheduleJobEvent.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/event/ScheduleJobEvent.java deleted file mode 100644 index 4a650d6..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/event/ScheduleJobEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.event; - -import com.yami.shop.quartz.model.ScheduleJob; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 定时任务事件 - */ -@Getter -@AllArgsConstructor -public class ScheduleJobEvent { - - private final ScheduleJob scheduleJob; -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/listener/SysJobListener.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/listener/SysJobListener.java deleted file mode 100644 index ed3ef13..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/listener/SysJobListener.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.listener; - -import cn.hutool.core.date.SystemClock; -import cn.hutool.core.util.StrUtil; -import com.yami.shop.quartz.event.ScheduleJobEvent; -import com.yami.shop.quartz.model.ScheduleJob; -import com.yami.shop.quartz.model.ScheduleJobLog; -import com.yami.shop.quartz.service.ScheduleJobLogService; -import com.yami.shop.quartz.util.SpringBeanTaskUtil; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.quartz.Trigger; -import org.springframework.context.event.EventListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.stereotype.Component; - -import java.util.Date; -import java.util.Objects; - - -/** - * 异步监听定时任务事件,解决job线程无故丢失的问题 - */ -@Slf4j -@Component -@EnableAsync -@AllArgsConstructor -public class SysJobListener { - - private final ScheduleJobLogService scheduleJobLogService; - - @Async - @EventListener(ScheduleJobEvent.class) - public void scheduleJobEventListener(ScheduleJobEvent event) { - ScheduleJob scheduleJob = event.getScheduleJob(); - if (Objects.isNull(scheduleJob)) { - return; - } - //数据库保存执行记录 - ScheduleJobLog jobLog = new ScheduleJobLog(); - jobLog.setJobId(scheduleJob.getJobId()); - jobLog.setBeanName(scheduleJob.getBeanName()); - jobLog.setMethodName(scheduleJob.getMethodName()); - jobLog.setParams(scheduleJob.getParams()); - jobLog.setCreateTime(new Date()); - - //任务开始时间 - long startTime = SystemClock.now(); - - try { - //执行任务 - log.info("任务准备执行,任务ID:" + scheduleJob.getJobId()); - - SpringBeanTaskUtil.invokeMethod(scheduleJob); - - //任务执行总时长 - long times = SystemClock.now() - startTime; - jobLog.setTimes((int)times); - jobLog.setStatus(1); - StringBuilder sb = new StringBuilder(); - - log.info(sb.append("任务执行完毕,任务ID:").append(jobLog.getJobId()).append(" 总共耗时:").append(times).append("毫秒").toString()); - } catch (Exception e) { - log.error("任务执行失败,任务ID:" + scheduleJob.getJobId(), e); - - //任务执行总时长 - long times = SystemClock.now() - startTime; - jobLog.setTimes((int)times); - jobLog.setStatus(0); - jobLog.setError(StrUtil.sub(e.toString(), 0, 2000)); - }finally { - scheduleJobLogService.save(jobLog); - } - } -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJob.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJob.java deleted file mode 100644 index e895f47..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJob.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.model; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import javax.validation.constraints.NotBlank; -import java.io.Serializable; -import java.util.Date; - -@Data -@TableName("tz_schedule_job") -public class ScheduleJob implements Serializable { - /** - * - */ - private static final long serialVersionUID = 9150018026309004044L; - - /** - * 任务id - */ - @TableId - private Long jobId; - - /** - * spring bean名称 - */ - - @NotBlank(message="bean名称不能为空") - private String beanName; - - /** - * 方法名 - */ - - @NotBlank(message="方法名称不能为空") - private String methodName; - - /** - * 参数 - */ - private String params; - - /** - * cron表达式 - */ - - @NotBlank(message="cron表达式不能为空") - private String cronExpression; - - /** - * 任务状态 0:正常 1:暂停 - */ - private Integer status; - - /** - * 备注 - */ - private String remark; - - /** - * 创建时间 - */ - - private Date createTime; -} \ No newline at end of file diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJobLog.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJobLog.java deleted file mode 100644 index e4e388b..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/model/ScheduleJobLog.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.model; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -import java.util.Date; - -@Data -@TableName("tz_schedule_job_log") -public class ScheduleJobLog { - /** - * 任务日志id - */ - @TableId - - private Long logId; - - /** - * 任务id - */ - - private Long jobId; - - /** - * spring bean名称 - */ - - private String beanName; - - /** - * 方法名 - */ - - private String methodName; - - /** - * 参数 - */ - private String params; - - /** - * 任务状态 1:成功 0:失败 - */ - private Integer status; - - /** - * 失败信息 - */ - private String error; - - /** - * 耗时(单位:毫秒) - */ - private Integer times; - - /** - * 创建时间 - */ - - private Date createTime; -} \ No newline at end of file diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobLogService.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobLogService.java deleted file mode 100644 index 58ddfb2..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobLogService.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.yami.shop.quartz.model.ScheduleJobLog; - -/** - * @author lgh - */ -public interface ScheduleJobLogService extends IService{ - -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobService.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobService.java deleted file mode 100644 index 726dc15..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/ScheduleJobService.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.yami.shop.quartz.model.ScheduleJob; - -/** - * - * @author lgh - * - */ -public interface ScheduleJobService extends IService{ - - /** - * 保存并开始定时任务 - * @param scheduleJob - */ - void saveAndStart(ScheduleJob scheduleJob); - - /** - * 更新定时任务 - * @param scheduleJob - */ - void updateScheduleJob(ScheduleJob scheduleJob); - - /** - * 批量删除定时任务 - * @param jobIds 需要删除的job id列表 - */ - void deleteBatch(Long[] jobIds); - - /** - * 批量更新定时任务状态 - * @param jobIds 需要更新的job id列表 - * @param status 更新后的状态 - * @return 更新数量 - */ - int updateBatch(Long[] jobIds, int status); - - /** - * 立即执行 - * @param jobIds job id列表 - */ - void run(Long[] jobIds); - - /** - * 暂停运行 - * @param jobIds job id列表 - */ - void pause(Long[] jobIds); - - /** - * 恢复运行 - * @param jobIds job id列表 - */ - void resume(Long[] jobIds); - -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobLogServiceImpl.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobLogServiceImpl.java deleted file mode 100644 index 79e90fe..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobLogServiceImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.service.impl; - -import com.yami.shop.quartz.dao.ScheduleJobLogMapper; -import com.yami.shop.quartz.model.ScheduleJobLog; -import com.yami.shop.quartz.service.ScheduleJobLogService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; - -/** - * @author lgh - */ -@Service("scheduleJobLogService") -public class ScheduleJobLogServiceImpl extends ServiceImpl implements ScheduleJobLogService { - - @Autowired - private ScheduleJobLogMapper scheduleJobLogMapper; - -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobServiceImpl.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobServiceImpl.java deleted file mode 100644 index d04dd0c..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/service/impl/ScheduleJobServiceImpl.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yami.shop.quartz.config.ScheduleManager; -import com.yami.shop.quartz.dao.ScheduleJobMapper; -import com.yami.shop.quartz.enums.ScheduleStatus; -import com.yami.shop.quartz.model.ScheduleJob; -import com.yami.shop.quartz.service.ScheduleJobService; -import org.quartz.CronTrigger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.PostConstruct; -import java.util.Arrays; -import java.util.Date; -import java.util.List; - -/** - * - * @author lgh - */ -@Service -public class ScheduleJobServiceImpl extends ServiceImpl implements ScheduleJobService { - - @Autowired - private ScheduleJobMapper scheduleJobMapper; - @Autowired - private ScheduleManager scheduleManager; - /** - * 项目启动时,初始化定时器 - */ - @PostConstruct - public void init(){ - list().forEach(scheduleJob -> { - CronTrigger trigger = scheduleManager.getCronTrigger(scheduleJob); - // 如果定时任务不存在,则创建定时任务 - if (trigger == null) { - scheduleManager.createScheduleJob(scheduleJob); - } else if (ScheduleStatus.NORMAL.getType().equals(scheduleJob.getStatus())) { - scheduleManager.resumeJob(scheduleJob); - } else if (ScheduleStatus.PAUSE.getType().equals(scheduleJob.getStatus())) { - scheduleManager.pauseJob(scheduleJob); - } - }); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void saveAndStart(ScheduleJob scheduleJob) { - scheduleJob.setCreateTime(new Date()); - scheduleJob.setStatus(ScheduleStatus.NORMAL.getType()); - scheduleJobMapper.insert(scheduleJob); - - scheduleManager.createScheduleJob(scheduleJob); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateScheduleJob(ScheduleJob scheduleJob) { - scheduleManager.updateScheduleJob(scheduleJob); - scheduleJobMapper.updateById(scheduleJob); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteBatch(Long[] jobIds) { - - List ids = Arrays.asList(jobIds); - this.listByIds(ids).forEach(scheduleJob -> { - scheduleManager.deleteScheduleJob(scheduleJob); - }); - scheduleJobMapper.deleteBatchIds(ids); - } - - @Override - public int updateBatch(Long[] jobIds, int status) { - return scheduleJobMapper.updateBatch(jobIds,status); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void run(Long[] jobIds) { - for(Long jobId : jobIds){ - scheduleManager.run(scheduleJobMapper.selectById(jobId)); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void pause(Long[] jobIds) { - this.listByIds(Arrays.asList(jobIds)).forEach(scheduleJob -> { - scheduleManager.pauseJob(scheduleJob); - }); - - updateBatch(jobIds, ScheduleStatus.PAUSE.getType()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void resume(Long[] jobIds) { - this.listByIds(Arrays.asList(jobIds)).forEach(scheduleJob -> { - scheduleManager.resumeJob(scheduleJob); - }); - - updateBatch(jobIds, ScheduleStatus.NORMAL.getType()); - } -} diff --git a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/util/SpringBeanTaskUtil.java b/yami-shop-quartz/src/main/java/com/yami/shop/quartz/util/SpringBeanTaskUtil.java deleted file mode 100644 index 09bf2b1..0000000 --- a/yami-shop-quartz/src/main/java/com/yami/shop/quartz/util/SpringBeanTaskUtil.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved. - * - * https://www.mall4j.com/ - * - * 未经允许,不可做商业用途! - * - * 版权所有,侵权必究! - */ - -package com.yami.shop.quartz.util; - -import cn.hutool.core.util.StrUtil; -import com.yami.shop.common.util.SpringContextUtils; -import com.yami.shop.quartz.model.ScheduleJob; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.ReflectionUtils; - -import java.lang.reflect.Method; - - -/** - * 定时任务spring bean 执行定时任务 - * @author LGH - */ -@Slf4j -public class SpringBeanTaskUtil { - - public static void invokeMethod(ScheduleJob scheduleJob) { - Object target = SpringContextUtils.getBean(scheduleJob.getBeanName()); - try { - if (StrUtil.isNotEmpty(scheduleJob.getParams())) { - Method method = target.getClass().getDeclaredMethod(scheduleJob.getMethodName(), String.class); - ReflectionUtils.makeAccessible(method); - method.invoke(target, scheduleJob.getParams()); - } else { - Method method = target.getClass().getDeclaredMethod(scheduleJob.getMethodName()); - ReflectionUtils.makeAccessible(method); - method.invoke(target); - } - } catch (Exception e) { - log.error("执行定时任务失败:", e); - throw new RuntimeException("执行定时任务失败", e); - } - } -} diff --git a/yami-shop-quartz/src/main/resources/application-quartz.yml b/yami-shop-quartz/src/main/resources/application-quartz.yml deleted file mode 100644 index c2b7366..0000000 --- a/yami-shop-quartz/src/main/resources/application-quartz.yml +++ /dev/null @@ -1,30 +0,0 @@ -# 数据源配置 -spring: - quartz: - #相关属性配置 - properties: - org: - quartz: - scheduler: - instanceName: clusteredScheduler - instanceId: AUTO - jobStore: - class: org.springframework.scheduling.quartz.LocalDataSourceJobStore - driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate - tablePrefix: QRTZ_ - isClustered: true - clusterCheckinInterval: 10000 - useProperties: false - misfireThreshold: 12000 - #线程池配置 - threadPool: - #实现的类名 - class: org.quartz.simpl.SimpleThreadPool - #线程数量 - threadCount: 3 - #线程优先级 - threadPriority: 5 - #自创建父线程 - threadsInheritContextClassLoaderOfInitializingThread: true - #数据库方式 - job-store-type: jdbc \ No newline at end of file diff --git a/yami-shop-quartz/src/main/resources/mapper/ScheduleJobLogMapper.xml b/yami-shop-quartz/src/main/resources/mapper/ScheduleJobLogMapper.xml deleted file mode 100644 index 152f6cf..0000000 --- a/yami-shop-quartz/src/main/resources/mapper/ScheduleJobLogMapper.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/yami-shop-quartz/src/main/resources/mapper/ScheduleJobMapper.xml b/yami-shop-quartz/src/main/resources/mapper/ScheduleJobMapper.xml deleted file mode 100644 index 00f66ff..0000000 --- a/yami-shop-quartz/src/main/resources/mapper/ScheduleJobMapper.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - update tz_schedule_job set status = #{status} where job_id in - - #{jobId} - - - \ No newline at end of file