From 87ee0bd55c02210c01972f40f757b0f48fa82844 Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Mon, 3 Jan 2022 23:21:43 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=8A=A0=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flyfish-backup/pom.xml | 26 ++++++++++++++ .../backup/controller/BackupController.java | 36 +++++++++++++++++++ .../framework/backup/domain}/Backup.java | 4 ++- .../backup/repository/BackupRepository.java | 12 +++++++ .../backup}/scheduler/BackupIndex.java | 3 +- .../backup}/scheduler/BackupScheduler.java | 30 +++++++++++----- .../backup/service/BackupService.java | 24 +++++++++++++ pom.xml | 1 + 8 files changed, 124 insertions(+), 12 deletions(-) create mode 100644 flyfish-backup/pom.xml create mode 100644 flyfish-backup/src/main/java/com/flyfish/framework/backup/controller/BackupController.java rename {flyfish-data/src/main/java/com/flyfish/framework/domain/po => flyfish-backup/src/main/java/com/flyfish/framework/backup/domain}/Backup.java (84%) create mode 100644 flyfish-backup/src/main/java/com/flyfish/framework/backup/repository/BackupRepository.java rename {flyfish-data/src/main/java/com/flyfish/framework => flyfish-backup/src/main/java/com/flyfish/framework/backup}/scheduler/BackupIndex.java (92%) rename {flyfish-data/src/main/java/com/flyfish/framework => flyfish-backup/src/main/java/com/flyfish/framework/backup}/scheduler/BackupScheduler.java (84%) create mode 100644 flyfish-backup/src/main/java/com/flyfish/framework/backup/service/BackupService.java diff --git a/flyfish-backup/pom.xml b/flyfish-backup/pom.xml new file mode 100644 index 0000000..9e5febd --- /dev/null +++ b/flyfish-backup/pom.xml @@ -0,0 +1,26 @@ + + + + flyfish-framework + com.flyfish.framework + 0.0.1-SNAPSHOT + + 4.0.0 + + flyfish-backup + + + 8 + 8 + + + + + com.flyfish.framework + flyfish-web + ${project.version} + + + diff --git a/flyfish-backup/src/main/java/com/flyfish/framework/backup/controller/BackupController.java b/flyfish-backup/src/main/java/com/flyfish/framework/backup/controller/BackupController.java new file mode 100644 index 0000000..2446bb4 --- /dev/null +++ b/flyfish-backup/src/main/java/com/flyfish/framework/backup/controller/BackupController.java @@ -0,0 +1,36 @@ +package com.flyfish.framework.backup.controller; + +import com.flyfish.framework.backup.domain.Backup; +import com.flyfish.framework.backup.scheduler.BackupScheduler; +import com.flyfish.framework.bean.Result; +import com.flyfish.framework.controller.reactive.ReactiveBaseController; +import com.flyfish.framework.domain.base.NameLikeQo; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * 备份controller + * + * @author wangyu + */ +@RestController +@RequestMapping("backups") +public class BackupController extends ReactiveBaseController> { + + @Resource + private BackupScheduler backupScheduler; + + /** + * 立即创建备份 + * + * @return 结果 + */ + @PostMapping("task") + public Result createTask() { + backupScheduler.backup(); + return Result.accept("已创建备份,完成后会出现在列表中,请稍后刷新再试。"); + } +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/domain/po/Backup.java b/flyfish-backup/src/main/java/com/flyfish/framework/backup/domain/Backup.java similarity index 84% rename from flyfish-data/src/main/java/com/flyfish/framework/domain/po/Backup.java rename to flyfish-backup/src/main/java/com/flyfish/framework/backup/domain/Backup.java index 735446d..23a649e 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/domain/po/Backup.java +++ b/flyfish-backup/src/main/java/com/flyfish/framework/backup/domain/Backup.java @@ -1,10 +1,11 @@ -package com.flyfish.framework.domain.po; +package com.flyfish.framework.backup.domain; import com.flyfish.framework.domain.base.AuditDomain; import com.flyfish.framework.enums.NamedEnum; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import org.springframework.data.mongodb.core.mapping.Document; /** * 系统备份 @@ -13,6 +14,7 @@ import lombok.Setter; */ @Getter @Setter +@Document(collection = "backups") public class Backup extends AuditDomain { // 文件路径 diff --git a/flyfish-backup/src/main/java/com/flyfish/framework/backup/repository/BackupRepository.java b/flyfish-backup/src/main/java/com/flyfish/framework/backup/repository/BackupRepository.java new file mode 100644 index 0000000..bfd9412 --- /dev/null +++ b/flyfish-backup/src/main/java/com/flyfish/framework/backup/repository/BackupRepository.java @@ -0,0 +1,12 @@ +package com.flyfish.framework.backup.repository; + +import com.flyfish.framework.backup.domain.Backup; +import com.flyfish.framework.repository.DefaultReactiveRepository; + +/** + * 备份仓库 + * + * @author wangyu + */ +public interface BackupRepository extends DefaultReactiveRepository { +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/scheduler/BackupIndex.java b/flyfish-backup/src/main/java/com/flyfish/framework/backup/scheduler/BackupIndex.java similarity index 92% rename from flyfish-data/src/main/java/com/flyfish/framework/scheduler/BackupIndex.java rename to flyfish-backup/src/main/java/com/flyfish/framework/backup/scheduler/BackupIndex.java index 617612f..894b6d2 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/scheduler/BackupIndex.java +++ b/flyfish-backup/src/main/java/com/flyfish/framework/backup/scheduler/BackupIndex.java @@ -1,9 +1,8 @@ -package com.flyfish.framework.scheduler; +package com.flyfish.framework.backup.scheduler; import lombok.AllArgsConstructor; import lombok.Data; -import java.nio.ByteBuffer; import java.util.List; /** diff --git a/flyfish-data/src/main/java/com/flyfish/framework/scheduler/BackupScheduler.java b/flyfish-backup/src/main/java/com/flyfish/framework/backup/scheduler/BackupScheduler.java similarity index 84% rename from flyfish-data/src/main/java/com/flyfish/framework/scheduler/BackupScheduler.java rename to flyfish-backup/src/main/java/com/flyfish/framework/backup/scheduler/BackupScheduler.java index 62964dd..26f2690 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/scheduler/BackupScheduler.java +++ b/flyfish-backup/src/main/java/com/flyfish/framework/backup/scheduler/BackupScheduler.java @@ -1,8 +1,8 @@ -package com.flyfish.framework.scheduler; +package com.flyfish.framework.backup.scheduler; import com.alibaba.fastjson.JSON; +import com.flyfish.framework.backup.domain.Backup; import com.flyfish.framework.domain.base.DomainService; -import com.flyfish.framework.domain.po.Backup; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -20,6 +20,7 @@ import org.springframework.util.unit.DataSize; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.io.IOException; import java.nio.channels.AsynchronousFileChannel; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -29,6 +30,7 @@ import java.nio.file.StandardOpenOption; import java.util.Date; import java.util.List; import java.util.UUID; +import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; /** @@ -75,9 +77,8 @@ public class BackupScheduler { public void backup() { // 本次备份任务代号 String code = UUID.randomUUID().toString(); - // 本次备份父目录 - String parent = backupPath + "/" + code; - createIfNotExists(parent); + // 本次备份父目录,出错时替换目录,保证备份成功 + String parent = createIfNotExists(backupPath + "/" + code); // 开始备份,先构造一个指示器 Backup backup = new Backup(); backup.setCreateTime(new Date()); @@ -85,6 +86,8 @@ public class BackupScheduler { backup.setCode(code); backup.setStatus(Backup.Status.RUNNING); backup.setFilepath(parent + "/back.zip"); + // 数据大小计数器 + AtomicLong sizeCounter = new AtomicLong(0); // 开始备份 operations.save(backup) .thenMany(Flux.fromIterable(this.collections)) @@ -98,7 +101,9 @@ public class BackupScheduler { BackupIndex index = new BackupIndex(); index.setId(code); index.setItems(list.stream().map(content -> { - DataSize size = DataSize.parse(new String(content.getContent(), StandardCharsets.UTF_8)); + long currentSize = content.getContent().length; + sizeCounter.addAndGet(currentSize); + DataSize size = DataSize.ofBytes(currentSize); BackupIndex.BackupItem item = new BackupIndex.BackupItem(); item.setCollection(content.getCollection()); item.setPath(parent + "/" + content.getCollection() + ".json"); @@ -112,6 +117,7 @@ public class BackupScheduler { backup.setLog("成功备份"); backup.setPeriod(new Date().getTime() - backup.getCreateTime().getTime()); backup.setStatus(Backup.Status.SUCCESS); + backup.setSize(DataSize.ofBytes(sizeCounter.get()).toKilobytes() + "KB"); return operations.save(backup); })) .subscribe(v -> { @@ -131,11 +137,17 @@ public class BackupScheduler { * @param filepath 路径 */ @SneakyThrows - private void createIfNotExists(String filepath) { + private String createIfNotExists(String filepath) { Path path = Paths.get(filepath); if (!Files.exists(path)) { - Files.createDirectories(path); + try { + Files.createDirectories(path); + } catch (IOException e) { + log.error(e.getMessage()); + return createIfNotExists(System.getProperty("user.home") + filepath); + } } + return filepath; } /** @@ -157,7 +169,7 @@ public class BackupScheduler { * @return 结果 */ private Mono write(byte[] content, String path) { - return Mono.fromCallable(() -> AsynchronousFileChannel.open(Paths.get(path), StandardOpenOption.WRITE)) + return Mono.fromCallable(() -> AsynchronousFileChannel.open(Files.createFile(Paths.get(path)), StandardOpenOption.WRITE)) .flatMapMany(channel -> DataBufferUtils.write(Mono.just(factory.wrap(content)), channel, 0)) .then(); } diff --git a/flyfish-backup/src/main/java/com/flyfish/framework/backup/service/BackupService.java b/flyfish-backup/src/main/java/com/flyfish/framework/backup/service/BackupService.java new file mode 100644 index 0000000..37956e6 --- /dev/null +++ b/flyfish-backup/src/main/java/com/flyfish/framework/backup/service/BackupService.java @@ -0,0 +1,24 @@ +package com.flyfish.framework.backup.service; + +import com.flyfish.framework.backup.domain.Backup; +import com.flyfish.framework.service.impl.BaseReactiveServiceImpl; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +/** + * 备份服务 + * + * @author wangyu + */ +@Service +public class BackupService extends BaseReactiveServiceImpl { + + /** + * 恢复指定备份 + * + * @return 结果 + */ + public Mono restore(String id) { + return Mono.empty(); + } +} diff --git a/pom.xml b/pom.xml index 2ef27f8..9ffb782 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,7 @@ flyfish-dict flyfish-form flyfish-approval + flyfish-backup