|
|
@@ -0,0 +1,119 @@
|
|
|
+package com.usoftchina.saas.dc.service.impl;
|
|
|
+
|
|
|
+import com.usoftchina.saas.account.cache.CompanyCache;
|
|
|
+import com.usoftchina.saas.account.cache.CompanyLockCache;
|
|
|
+import com.usoftchina.saas.context.SpringContextHolder;
|
|
|
+import com.usoftchina.saas.dc.backup.*;
|
|
|
+import com.usoftchina.saas.dc.mapper.BackupMapper;
|
|
|
+import com.usoftchina.saas.dc.po.Backup;
|
|
|
+import com.usoftchina.saas.dc.po.DataSourceInfo;
|
|
|
+import com.usoftchina.saas.dc.service.BackupService;
|
|
|
+import com.usoftchina.saas.dc.service.DataSourceInfoService;
|
|
|
+import com.usoftchina.saas.exception.Try;
|
|
|
+import com.usoftchina.saas.file.api.FileApi;
|
|
|
+import com.usoftchina.saas.file.dto.FileInfoDTO;
|
|
|
+import com.usoftchina.saas.file.util.FileUploadUtils;
|
|
|
+import com.usoftchina.saas.utils.CollectionUtils;
|
|
|
+import com.usoftchina.saas.utils.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.context.event.EventListener;
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author yingp
|
|
|
+ * @date 2019/1/15
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class BackupServiceImpl implements BackupService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private BackupMapper backupMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private DataSourceInfoService dataSourceInfoService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FileApi fileApi;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MysqlStrategy mysqlStrategy;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Backup newBackupTask() {
|
|
|
+ Backup backup = new Backup();
|
|
|
+ backupMapper.insert(backup);
|
|
|
+ SpringContextHolder.getContext().publishEvent(new BackupReadyEvent(this, backup));
|
|
|
+ return backup;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void dump(long companyId) throws Exception {
|
|
|
+ dump(new Backup(companyId));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void dump(Backup backup) throws Exception {
|
|
|
+ String dcName = StringUtils.nullIf(CompanyCache.current().getCompany().getDcName(), "default");
|
|
|
+ List<DataSourceInfo> dss = dataSourceInfoService.findByDcNameUseDefault(dcName);
|
|
|
+ if (!CollectionUtils.isEmpty(dss)) {
|
|
|
+ DumpContext context = new DumpContext(backup);
|
|
|
+ try {
|
|
|
+ dss.parallelStream().forEach(Try.accept(ds -> {
|
|
|
+ if ("mysql".equals(ds.getDbType())) {
|
|
|
+ mysqlStrategy.exp(context, ds);
|
|
|
+ }
|
|
|
+ }));
|
|
|
+ FileInfoDTO fileInfoDTO = FileUploadUtils.upload(context.getZipFile());
|
|
|
+ SpringContextHolder.getContext().publishEvent(
|
|
|
+ new BackupSuccessEvent(this, backup, fileInfoDTO));
|
|
|
+ } finally {
|
|
|
+ context.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean removeByPrimaryKey(Long id) {
|
|
|
+ return backupMapper.deleteByPrimaryKey(id) > -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Async
|
|
|
+ @EventListener(BackupReadyEvent.class)
|
|
|
+ public void onBackupReady(BackupReadyEvent event) {
|
|
|
+ Backup backup = event.getBackup();
|
|
|
+ try {
|
|
|
+ backup.setStatus(Backup.Status.DUMPING);
|
|
|
+ backupMapper.updateByPrimaryKeySelective(backup);
|
|
|
+ // 为防止导出过程中有人操作,导致部分数据不一致,在导出前锁定该公司不允许操作
|
|
|
+ CompanyLockCache.lock(backup.getCompanyId());
|
|
|
+ dump(backup);
|
|
|
+ } catch (Exception e) {
|
|
|
+ SpringContextHolder.getContext().publishEvent(
|
|
|
+ new BackupFailedEvent(this, backup, e));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Async
|
|
|
+ @EventListener(BackupFailedEvent.class)
|
|
|
+ public void onBackupFailed(BackupFailedEvent event) {
|
|
|
+ Backup backup = event.getBackup();
|
|
|
+ // 解除锁定
|
|
|
+ CompanyLockCache.unlock(backup.getCompanyId());
|
|
|
+ backup.setStatus(Backup.Status.FAILED);
|
|
|
+ backup.setMessage(event.getException().getMessage());
|
|
|
+ backupMapper.updateByPrimaryKeySelective(backup);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Async
|
|
|
+ @EventListener(BackupSuccessEvent.class)
|
|
|
+ public void onBackupSuccess(BackupSuccessEvent event) {
|
|
|
+ Backup backup = event.getBackup();
|
|
|
+ // 解除锁定
|
|
|
+ CompanyLockCache.unlock(backup.getCompanyId());
|
|
|
+ backup.setStatus(Backup.Status.SUCCESS);
|
|
|
+ backup.setFilePath(event.getFileInfo().getId());
|
|
|
+ backupMapper.updateByPrimaryKeySelective(backup);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|