diff --git a/dao/src/main/java/cn/bunny/dao/dto/log/ScheduleExecuteLogDto.java b/dao/src/main/java/cn/bunny/dao/dto/log/ScheduleExecuteLogDto.java index 5a493e4..5c1a144 100644 --- a/dao/src/main/java/cn/bunny/dao/dto/log/ScheduleExecuteLogDto.java +++ b/dao/src/main/java/cn/bunny/dao/dto/log/ScheduleExecuteLogDto.java @@ -6,8 +6,6 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.time.LocalDateTime; - @Data @AllArgsConstructor @NoArgsConstructor @@ -30,7 +28,4 @@ public class ScheduleExecuteLogDto { @Schema(name = "triggerName", title = "触发器名称") private String triggerName; - @Schema(name = "endTime", title = "结束时间") - private LocalDateTime endTime; - } diff --git a/dao/src/main/java/cn/bunny/dao/entity/log/ScheduleExecuteLog.java b/dao/src/main/java/cn/bunny/dao/entity/log/ScheduleExecuteLog.java index 2ae287e..7743dda 100644 --- a/dao/src/main/java/cn/bunny/dao/entity/log/ScheduleExecuteLog.java +++ b/dao/src/main/java/cn/bunny/dao/entity/log/ScheduleExecuteLog.java @@ -7,8 +7,6 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import java.time.LocalDateTime; - /** *

* 调度任务执行日志 @@ -45,9 +43,6 @@ public class ScheduleExecuteLog extends BaseEntity { @Schema(name = "duration", title = "执行时间") private Long duration; - @Schema(name = "endTime", title = "结束时间") - private LocalDateTime endTime; - } diff --git a/dao/src/main/java/cn/bunny/dao/pojo/constant/LocalDateTimeConstant.java b/dao/src/main/java/cn/bunny/dao/pojo/constant/LocalDateTimeConstant.java index 6ef9f39..5ce334d 100644 --- a/dao/src/main/java/cn/bunny/dao/pojo/constant/LocalDateTimeConstant.java +++ b/dao/src/main/java/cn/bunny/dao/pojo/constant/LocalDateTimeConstant.java @@ -7,5 +7,5 @@ public class LocalDateTimeConstant { public static final String YYYY_MM_DD = "yyyy-MM-dd"; public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; public static final String YYYY_MM_DD_HH_MM_SS_SLASH = "yyyy/MM/dd HH:mm:ss"; - public static final String YYYY_MM_DD_HH_MM_SS_UNDERLINE = "yyyy-MM-dd HH_mm_ss_SSS"; + public static final String YYYY_MM_DD_HH_MM_SS_UNDERLINE = "yyyy_MM_dd_HH_mm_ss_SSS"; } diff --git a/dao/src/main/java/cn/bunny/dao/vo/log/QuartzExecuteLogVo.java b/dao/src/main/java/cn/bunny/dao/vo/log/QuartzExecuteLogVo.java index 4cb80ee..ec87a28 100644 --- a/dao/src/main/java/cn/bunny/dao/vo/log/QuartzExecuteLogVo.java +++ b/dao/src/main/java/cn/bunny/dao/vo/log/QuartzExecuteLogVo.java @@ -4,8 +4,6 @@ import cn.bunny.dao.vo.common.BaseVo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; -import java.time.LocalDateTime; - @EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor @@ -35,7 +33,4 @@ public class QuartzExecuteLogVo extends BaseVo { @Schema(name = "duration", title = "执行时间") private Integer duration; - @Schema(name = "endTime", title = "结束时间") - private LocalDateTime endTime; - } diff --git a/service/Dockerfile b/service/Dockerfile index e6081a7..a6c4a16 100644 --- a/service/Dockerfile +++ b/service/Dockerfile @@ -18,7 +18,7 @@ COPY target/*.jar /home/server/app.jar VOLUME /usr/bin/docker VOLUME ["/var/run/docker.sock"] VOLUME /etc/docker/daemon.json -VOLUME ["/bunny/docker_data/mysql/slave_3304/backup"] +VOLUME ["/home/backup"] # 启动容器时的进程 ENTRYPOINT ["java","-jar","/home/server/app.jar"] diff --git a/service/src/main/java/cn/bunny/services/controller/SchedulersController.java b/service/src/main/java/cn/bunny/services/controller/SchedulersController.java index c85a619..81ca2f8 100644 --- a/service/src/main/java/cn/bunny/services/controller/SchedulersController.java +++ b/service/src/main/java/cn/bunny/services/controller/SchedulersController.java @@ -65,14 +65,14 @@ public class SchedulersController { } @Operation(summary = "暂停任务", description = "暂停任务") - @PutMapping("/pauseScheduler") + @PutMapping("/pauseSchedulers") public Result pause(@RequestBody SchedulersOperationDto dto) { schedulersService.pauseScheduler(dto); return Result.success(); } @Operation(summary = "恢复任务", description = "恢复任务") - @PutMapping("/resumeScheduler") + @PutMapping("/resumeSchedulers") public Result resume(@RequestBody SchedulersOperationDto dto) { schedulersService.resumeScheduler(dto); return Result.success(); diff --git a/service/src/main/java/cn/bunny/services/quartz/DatabaseBackupJob.java b/service/src/main/java/cn/bunny/services/quartz/DatabaseBackupJob.java index c8e37a0..ca2a167 100644 --- a/service/src/main/java/cn/bunny/services/quartz/DatabaseBackupJob.java +++ b/service/src/main/java/cn/bunny/services/quartz/DatabaseBackupJob.java @@ -1,16 +1,23 @@ package cn.bunny.services.quartz; -import cn.bunny.dao.pojo.constant.LocalDateTimeConstant; import cn.bunny.services.aop.annotation.QuartzSchedulers; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.quartz.Job; +import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; -import org.springframework.beans.factory.annotation.Value; +import org.quartz.Scheduler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.repository.init.ResourceReader; import org.springframework.stereotype.Component; +import java.io.BufferedReader; import java.io.InputStream; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.TimeUnit; @Slf4j @@ -18,46 +25,47 @@ import java.time.format.DateTimeFormatter; @Component public class DatabaseBackupJob implements Job { - @Value("${spring.datasource.dynamic.datasource.master.username}") - private String masterUsername; - - @Value("${spring.datasource.dynamic.datasource.master.password}") - private String masterPassword; - - @Value("${bunny.master.database}") - private String masterDatabase; - - @Value("${bunny.master.databaseBackupDir}") - private String databaseBackupDir; + @Autowired + private Scheduler scheduler; + @SneakyThrows @Override public void execute(JobExecutionContext context) { - // 格式化时间 - LocalDateTime localStartExecuteTime = LocalDateTime.now(); - DateTimeFormatter sqlTimeFormatter = DateTimeFormatter.ofPattern(LocalDateTimeConstant.YYYY_MM_DD_HH_MM_SS_UNDERLINE); - String sqlTimeNow = localStartExecuteTime.format(sqlTimeFormatter); - - // 命令行参数 - String dockerCommand = "docker exec -it bunny_auth_server bash"; - String mysqldumpCommand = "mysqldump -u " + masterUsername + " -p" + masterPassword + " " + masterDatabase + " > " + databaseBackupDir + "backup_auth_admin_" + sqlTimeNow + ".sql"; - ProcessBuilder processBuilder = new ProcessBuilder(dockerCommand, mysqldumpCommand); - - try { - // 执行命令 - Process process = processBuilder.start(); - - // 执行后读取内容 - InputStream inputStream = process.getInputStream(); - StringBuilder output = new StringBuilder(); - byte[] bytes = new byte[1024]; - int bytesRead; - - while ((bytesRead = inputStream.read(bytes)) != -1) { - output.append(new String(bytes, 0, bytesRead)); - } - System.out.println(output); - } catch (Exception exception) { - throw new RuntimeException(exception); + InputStream inputStream = ResourceReader.class.getResourceAsStream("static/backup.sh"); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + String line; + while ((line = reader.readLine()) != null) { + System.out.println(line); } + // 执行脚本 + String scriptPath = Objects.requireNonNull(getClass().getClassLoader().getResource("static/backup.sh")).getPath(); + ProcessBuilder processBuilder = new ProcessBuilder("bash", scriptPath); + processBuilder.redirectErrorStream(true); + Process process = processBuilder.start(); + + // 执行命令 + ProcessHandle handle = process.toHandle(); + + // 执行任务的pid + long pid = handle.pid(); + + // 执行任务系统信息 + JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); + Map environment = processBuilder.environment(); + String info = handle.info().toString(); + jobDataMap.put("pid", pid); + jobDataMap.put("systemInfo", info); + jobDataMap.put("environment", environment); + + // 进程是否结束 + if (process.waitFor(5, TimeUnit.MINUTES)) { + int waitedFor = process.waitFor(); + jobDataMap.put("existCode", waitedFor); + } else process.destroyForcibly(); + + // // 执行后读取内容 + // BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + // String line; + // while ((line = reader.readLine()) != null) {System.out.println(line);} } } diff --git a/service/src/main/java/cn/bunny/services/service/impl/SchedulersServiceImpl.java b/service/src/main/java/cn/bunny/services/service/impl/SchedulersServiceImpl.java index 210e156..c41d71a 100644 --- a/service/src/main/java/cn/bunny/services/service/impl/SchedulersServiceImpl.java +++ b/service/src/main/java/cn/bunny/services/service/impl/SchedulersServiceImpl.java @@ -18,8 +18,6 @@ import jakarta.validation.Valid; import org.quartz.*; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.util.HashMap; @@ -76,7 +74,6 @@ public class SchedulersServiceImpl extends ServiceImpl> getAllScheduleJobList() { Set> classesWithAnnotation = annotationScanner.getClassesWithAnnotation(QuartzSchedulers.class); return classesWithAnnotation.stream().map(cls -> { @@ -103,7 +100,6 @@ public class SchedulersServiceImpl extends ServiceImpl - - id, create_time, update_time, create_user, update_user, is_deleted, job_name, job_group, job_class_name, cron_expression, trigger_name, execute_result, duration, end_time + id, create_time, update_time, create_user, update_user, is_deleted, job_name, job_group, job_class_name, cron_expression, trigger_name, execute_result, duration @@ -46,9 +45,6 @@ and trigger_name like CONCAT('%',#{dto.triggerName},'%') - - and end_time like CONCAT('%',#{dto.endTime},'%') - order by update_time desc diff --git a/service/src/main/resources/static/backup.sh b/service/src/main/resources/static/backup.sh new file mode 100644 index 0000000..b144866 --- /dev/null +++ b/service/src/main/resources/static/backup.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +# 设置备份文件存放目录 +backup_dir="/home/backup/" + +# 获取当前时间并格式化为 yyyy_MM_dd_HH_mm_ss_SSS 格式 +timestamp=$(date +"%Y_%m_%d_%H_%M_%S_%3N") + +# 设置数据库用户名、密码和数据库名 +db_user="root" +db_pass="02120212" +db_name="auth_admin" + +# 设置备份文件名 +backup_file="${backup_dir}backup_${db_name}_${timestamp}.sql" + +# 执行备份命令 +docker exec -it slave_3304 bash -c "mysqldump -u ${db_user} -p${db_pass} ${db_name} > ${backup_file}" + +# 输出备份文件路径 +echo "Backup completed: ${backup_file}" \ No newline at end of file diff --git a/service/src/test/java/cn/bunny/service/TestPath.java b/service/src/test/java/cn/bunny/service/TestPath.java new file mode 100644 index 0000000..4c317c8 --- /dev/null +++ b/service/src/test/java/cn/bunny/service/TestPath.java @@ -0,0 +1,48 @@ +package cn.bunny.service; + +import lombok.SneakyThrows; +import org.junit.jupiter.api.Test; +import org.springframework.core.io.ResourceLoader; +import org.springframework.data.redis.core.script.ScriptExecutor; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Objects; + +public class TestPath { + @SneakyThrows + @Test + void testPath() { + String scriptPath = Objects.requireNonNull(getClass().getClassLoader().getResource("static/backup.sh")).getPath(); + String path = ScriptExecutor.class.getClassLoader().getResource("static/backup.sh").getPath(); + System.out.println(path); + // 执行脚本 + ProcessBuilder processBuilder = new ProcessBuilder("bash", scriptPath); + processBuilder.redirectErrorStream(true); + Process process = processBuilder.start(); + + // 执行后读取内容 + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = reader.readLine()) != null) {System.out.println(line);} + } + + @SneakyThrows + @Test + void test2() { + ClassLoader classLoader = ResourceLoader.class.getClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream("static/backup.sh"); + try (java.util.Scanner s = new java.util.Scanner(inputStream)) { + while (s.hasNext()) { + System.out.println(s.nextLine()); + } + } + + + byte[] bytes = inputStream.readAllBytes(); + String string = new String(bytes, StandardCharsets.UTF_8); + System.out.println(string); + } +}