Commit 6bdfa9f8 zshaohui

数据备份提交

1 个父辈 3123116f
......@@ -194,6 +194,15 @@ public class DateUtil {
return date;
}
/**
* 获取距离今天monthFromToday 月的不带时间的日期
*/
public static Date addMonthsFromToday(int monthFromToday){
Calendar c = noTimeCalendar();
c.add(Calendar.MONTH, monthFromToday);
return c.getTime();
}
public static class Req{
private String seq;
private int op;
......
......@@ -17,6 +17,8 @@ import com.neotel.smfcore.core.system.rest.bean.dto.SettingsDto;
import com.neotel.smfcore.core.system.rest.bean.dto.SysSettingsDto;
import com.neotel.smfcore.core.system.rest.bean.mapstruct.SettingsMapper;
import com.neotel.smfcore.core.system.service.po.Settings;
import com.neotel.smfcore.core.system.util.DbBackupService;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.rest.bean.dto.MenuDto;
import com.neotel.smfcore.security.rest.bean.query.UserQueryCriteria;
import com.neotel.smfcore.security.service.po.Menu;
......@@ -50,6 +52,10 @@ import java.util.*;
public class SettingsController {
@Autowired
private DataCache dataCache;
@Autowired
private DbBackupService dbBackupService;
/**
* 当前版本
*/
......@@ -174,6 +180,19 @@ public class SettingsController {
downloadOrderModel(response);
}
@ApiOperation("修改数据备份时间")
@PutMapping("/dbBackup")
@PreAuthorize("@el.check('dbBackupSetting')")
@AnonymousAccess
public ResultBean updateDbBackupSetting(@RequestBody Map<String,Integer> paramMap) {
Integer months = paramMap.get("months");
if (months == null || months < 1) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"存档月数"});
}
dbBackupService.updateDbBackupSetting(months);
return ResultBean.newOkResult("");
}
public void downloadOrderModel( HttpServletResponse response) throws IOException {
try {
List<Map<String, Object>> maps = new ArrayList<>();
......
package com.neotel.smfcore.core.system.util;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.inList.service.po.InList;
import com.neotel.smfcore.core.inList.service.po.InListItem;
import com.neotel.smfcore.core.message.service.po.Message;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.system.service.dao.IAlarmInfoDao;
import com.neotel.smfcore.core.system.service.po.AlarmInfo;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.service.po.Humiture;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* @author sunke
* @date 2023/1/31 10:02 AM
*/
@Slf4j
@Service
public class DbBackupService {
/**
* 自动存档间隔Key
*/
private String BACKUP_MONTH_KEY = "db.backup.month";
/**
* 上次自动存档时间
*/
private String LAST_BACKUP_TIME_KEY = "db.backup.lastTime";
@Autowired
DataCache dataCache;
@Autowired
private IAlarmInfoDao alarmInfoDao;
boolean processing = false;
@PostConstruct
public void init(){
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(new Runnable() {
@Override
public void run() {
log.info("开启数据库定时存档任务");
while(true){
try{
Integer dbBackupMonth = dataCache.getCache(BACKUP_MONTH_KEY);
//dbBackupMonth = 1;
if(dbBackupMonth != null && dbBackupMonth > 0){
Date lastBackupTime = dataCache.getCache(LAST_BACKUP_TIME_KEY);
boolean needBackup = false;
if(lastBackupTime == null){
needBackup = true;
}else{
long monthNum = cn.hutool.core.date.DateUtil.betweenMonth(lastBackupTime, new Date(), true);
if(monthNum >= 1){
//未备份过的或上次备份时间距当前一个月的,进行备份
needBackup = true;
}
}
if(needBackup){
backup();
}
}
TimeUnit.HOURS.sleep(1);
}catch (Exception e){
log.error("数据库定时存档任务出错"+e.getMessage());
}
}
}
});
}
/**
* 备份数据库数据比较多的表
* @return
*/
public boolean backup(){
if(processing){
log.info("上一次存档任务未完成,忽略本次存档");
return false;
}
processing = true;
Integer dbBackupMonth = dataCache.getCache(BACKUP_MONTH_KEY);
if(dbBackupMonth == null){
dbBackupMonth = 12;//默认备份12个月前的数据
dataCache.updateCache(BACKUP_MONTH_KEY,dbBackupMonth);
}
backupTable(dbBackupMonth,
DataLog.class,
Humiture.class,
LiteOrder.class,
LiteOrderItem.class,
InList.class,
InListItem.class,
Message.class,
AlarmInfo.class
);
dataCache.updateCache(LAST_BACKUP_TIME_KEY,new Date());
processing = false;
return true;
}
private void backupTable(int monthsBefore,Class<?>... entityClassList){
for (Class<?> entityClass : entityClassList) {
try{
MongoTemplate mongoTemplate = alarmInfoDao.getMongoTemplate();
Date monthsBeforeToday = DateUtil.addMonthsFromToday(-monthsBefore);
Criteria c = Criteria.where("createDate").lt(monthsBeforeToday);
Query query = new Query(c);
PageRequest page = PageRequest.ofSize(20000);
String collectionName = mongoTemplate.getCollectionName(entityClass);
collectionName = collectionName;
log.info("开始存档["+collectionName+"]的数据");
String backupCollectionName = collectionName + "_bak_"+DateUtil.toDateString(new Date(),"yyyyMMddHHmmss");
while (true){
query.with(page);
log.info("开始存档["+collectionName+"]的第["+page.getOffset()+"]条数据");
List<?> data = mongoTemplate.find(query, entityClass,collectionName);
log.info("查询到["+data.size()+"]条数据");
if(data == null || data.isEmpty()){
break;
}
mongoTemplate.insert(data,backupCollectionName);
page = page.next();
}
log.info("存档["+collectionName+"]的数据完成,开始清理原始数据");
Query removeQuery = new Query(c);
mongoTemplate.remove(removeQuery,entityClass,collectionName);
log.info("["+collectionName+"]的数据清理完成");
}catch (Exception e){
log.error("数据存档失败",e);
}
}
}
public void updateDbBackupSetting(Integer months) {
dataCache.updateCache(BACKUP_MONTH_KEY,months);
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!