mirror of
https://gitee.com/bookshelfplus/bookshelfplus
synced 2025-10-03 22:45:15 +08:00
147 lines
5.6 KiB
Java
147 lines
5.6 KiB
Java
package plus.bookshelf.Service.Impl;
|
||
|
||
import org.springframework.beans.BeanUtils;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.stereotype.Service;
|
||
import org.springframework.transaction.annotation.Transactional;
|
||
import plus.bookshelf.Common.Enum.ScheduleTaskActionEnum;
|
||
import plus.bookshelf.Common.Error.BusinessErrorCode;
|
||
import plus.bookshelf.Common.Error.BusinessException;
|
||
import plus.bookshelf.Common.FileManager.QCloudCosUtils;
|
||
import plus.bookshelf.Config.QCloudCosConfig;
|
||
import plus.bookshelf.Dao.DO.ScheduleTaskDO;
|
||
import plus.bookshelf.Dao.Mapper.ScheduleTaskDOMapper;
|
||
import plus.bookshelf.Service.Model.ScheduleTaskModel;
|
||
import plus.bookshelf.Service.Service.CosPresignedUrlGenerateLogService;
|
||
|
||
import java.util.Date;
|
||
import java.util.concurrent.Executors;
|
||
import java.util.concurrent.TimeUnit;
|
||
|
||
import static plus.bookshelf.Common.Enum.ScheduleTaskActionEnum.*;
|
||
|
||
@Service
|
||
public class ScheduleTaskServiceImpl {
|
||
|
||
@Autowired
|
||
QCloudCosConfig qCloudCosConfig;
|
||
|
||
@Autowired
|
||
CosPresignedUrlGenerateLogService cosPresignedUrlGenerateLogService;
|
||
|
||
@Autowired
|
||
ScheduleTaskDOMapper scheduleTaskDOMapper;
|
||
|
||
@Autowired
|
||
FileServiceImpl fileService;
|
||
|
||
public void setExecutor() {
|
||
// 创建定时任务 (主要是待用户将文件上传成功到COS后)
|
||
java.util.concurrent.ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
|
||
// 参数:1、任务体 2、首次执行的延时时间
|
||
// 3、任务执行间隔 4、间隔时间单位
|
||
service.scheduleAtFixedRate(() -> {
|
||
try {
|
||
thingsTodo();
|
||
} catch (BusinessException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}, 0, 3, TimeUnit.SECONDS);
|
||
}
|
||
|
||
@Transactional
|
||
public void thingsTodo() throws BusinessException {
|
||
|
||
// 检查上传文件后未收到客户端发来的上传完成消息的情况。
|
||
// 如果系统里面没有记录,那么删除COS存储桶中用户上传的这个文件。
|
||
|
||
System.out.println("检查定时任务");
|
||
|
||
ScheduleTaskDO[] scheduleTaskDO = scheduleTaskDOMapper.selectTodoTask();
|
||
|
||
for (ScheduleTaskDO task : scheduleTaskDO) {
|
||
ScheduleTaskModel scheduleTaskModel = convertToModel(task);
|
||
switch (scheduleTaskModel.getAction()) {
|
||
case CHECK_FILE_IS_UPLOADED:
|
||
// TODO 系统中没有这个文件,而对象存储中有这个文件,那么删除对象存储中的文件
|
||
// fileService.doScheduleTask(scheduleTaskModel);
|
||
// 检查文件是否被上传
|
||
QCloudCosUtils qCloudCosUtils = new QCloudCosUtils(qCloudCosConfig, cosPresignedUrlGenerateLogService);
|
||
Boolean isExists = qCloudCosUtils.doesObjectExist(QCloudCosUtils.BOOK_SAVE_FOLDER, task.getData());
|
||
if (isExists) {
|
||
// 如果文件存在,则更新数据库中的状态
|
||
// TODO
|
||
System.out.println("文件已经上传,更新数据库中的状态");
|
||
}
|
||
|
||
// 在数据库中设置为完成
|
||
Boolean isDoneSuccess = doneScheduleTask(task.getId());
|
||
if (!isDoneSuccess) {
|
||
throw new BusinessException(BusinessErrorCode.UNKNOWN_ERROR, "系统错误!更新数据库中的状态失败");
|
||
}
|
||
break;
|
||
default:
|
||
throw new BusinessException(BusinessErrorCode.UNKNOWN_ERROR, "未知的定时任务类型");
|
||
}
|
||
}
|
||
|
||
// 输出
|
||
System.out.println("Task ScheduledExecutorService " + new Date());
|
||
}
|
||
|
||
/**
|
||
* 创建一个新的定时任务(存入数据库)
|
||
*
|
||
* @param scheduleTaskModel
|
||
* @return
|
||
*/
|
||
public Boolean insertScheduleTask(ScheduleTaskModel scheduleTaskModel) {
|
||
ScheduleTaskDO scheduleTaskDO = convertToDataObject(scheduleTaskModel);
|
||
int affectRows = scheduleTaskDOMapper.insertSelective(scheduleTaskDO);
|
||
return affectRows > 0;
|
||
}
|
||
|
||
/**
|
||
* 完成一个定时任务(从数据库中删除)
|
||
* 注意先删除,删除成功后才进行处理,避免自动触发和手动触发同时进行
|
||
*
|
||
* @param scheduleTaskId
|
||
* @return
|
||
*/
|
||
public Boolean doneScheduleTask(Integer scheduleTaskId) {
|
||
int affectRows = scheduleTaskDOMapper.deleteByPrimaryKey(scheduleTaskId);
|
||
return affectRows > 0;
|
||
}
|
||
|
||
/**
|
||
* 通过 Guid 查询任务
|
||
*
|
||
* @param guid
|
||
* @return
|
||
*/
|
||
public ScheduleTaskModel findTaskByGuid(String guid) {
|
||
ScheduleTaskDO scheduleTaskDO = scheduleTaskDOMapper.selectByGuid(guid);
|
||
return convertToModel(scheduleTaskDO);
|
||
}
|
||
|
||
private static ScheduleTaskDO convertToDataObject(ScheduleTaskModel scheduleTaskModel) {
|
||
if (scheduleTaskModel == null) {
|
||
return null;
|
||
}
|
||
ScheduleTaskDO scheduleTaskDO = new ScheduleTaskDO();
|
||
BeanUtils.copyProperties(scheduleTaskModel, scheduleTaskDO);
|
||
scheduleTaskDO.setAction(String.valueOf(scheduleTaskModel.getAction()));
|
||
return scheduleTaskDO;
|
||
}
|
||
|
||
private static ScheduleTaskModel convertToModel(ScheduleTaskDO scheduleTaskDO) {
|
||
if (scheduleTaskDO == null) {
|
||
return null;
|
||
}
|
||
ScheduleTaskModel scheduleTaskModel = new ScheduleTaskModel();
|
||
BeanUtils.copyProperties(scheduleTaskDO, scheduleTaskModel);
|
||
scheduleTaskModel.setAction(ScheduleTaskActionEnum.valueOf(scheduleTaskDO.getAction()));
|
||
return scheduleTaskModel;
|
||
}
|
||
}
|