refactor: 移除图片保存相关逻辑,直接更新任务状态为完成

This commit is contained in:
zyh
2025-08-30 15:43:58 +08:00
parent 63e42368cb
commit abe1447e0c
9 changed files with 51 additions and 834 deletions

View File

@@ -1,168 +0,0 @@
package com.gameplatform.server.task;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.gameplatform.server.mapper.agent.LinkTaskMapper;
import com.gameplatform.server.model.entity.agent.LinkTask;
import com.gameplatform.server.service.link.DeviceTaskUpdateService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
/**
* 图片保存定时任务
* 每3分钟为进行中的任务保存图片快照
*/
@Component
public class ImageSaveScheduleTask {
private static final Logger log = LoggerFactory.getLogger(ImageSaveScheduleTask.class);
private final LinkTaskMapper linkTaskMapper;
private final DeviceTaskUpdateService deviceTaskUpdateService;
// 使用单独的线程池执行图片保存任务,避免阻塞主线程
private final Executor imageTaskExecutor = Executors.newFixedThreadPool(2);
public ImageSaveScheduleTask(
LinkTaskMapper linkTaskMapper,
DeviceTaskUpdateService deviceTaskUpdateService) {
this.linkTaskMapper = linkTaskMapper;
this.deviceTaskUpdateService = deviceTaskUpdateService;
log.info("图片保存定时任务已初始化");
}
/**
* 每3分钟执行一次的图片保存任务
* 使用fixedDelay确保上一次执行完成后再开始下一次
*/
@Scheduled(fixedDelayString = "${image.save-interval-minutes:3}", timeUnit = TimeUnit.MINUTES)
public void saveProgressImages() {
try {
log.debug("开始执行进度图片保存定时任务");
// 查找所有LOGGED_IN状态的任务
QueryWrapper<LinkTask> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("status", "LOGGED_IN");
List<LinkTask> activeTasks = linkTaskMapper.selectList(queryWrapper);
if (activeTasks.isEmpty()) {
log.debug("当前没有进行中的任务,跳过图片保存");
return;
}
log.info("发现 {} 个进行中的任务,开始保存进度图片", activeTasks.size());
// 分批处理任务,避免同时处理过多任务
processBatchTasks(activeTasks);
} catch (Exception e) {
log.error("执行进度图片保存定时任务时发生异常", e);
}
}
/**
* 分批处理任务列表
*/
private void processBatchTasks(List<LinkTask> tasks) {
final int batchSize = 5; // 每批处理5个任务
for (int i = 0; i < tasks.size(); i += batchSize) {
final int startIndex = i;
final int endIndex = Math.min(i + batchSize, tasks.size());
final List<LinkTask> batch = tasks.subList(startIndex, endIndex);
// 异步处理每一批任务
imageTaskExecutor.execute(() -> processSingleBatch(batch, startIndex / batchSize + 1));
// 批次之间稍微延迟,避免过度并发
if (endIndex < tasks.size()) {
try {
Thread.sleep(1000); // 延迟1秒
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.warn("批次间延迟被中断");
}
}
}
}
/**
* 处理单个批次的任务
*/
private void processSingleBatch(List<LinkTask> batch, int batchNumber) {
log.debug("开始处理第 {} 批任务,共 {} 个任务", batchNumber, batch.size());
for (LinkTask task : batch) {
try {
// 为每个任务随机延迟0-10秒避免同时请求
int delaySeconds = ThreadLocalRandom.current().nextInt(0, 10);
Thread.sleep(delaySeconds * 1000L);
// 保存任务的进度图片
deviceTaskUpdateService.saveProgressImagesForTask(task.getMachineId(), task.getCodeNo());
log.debug("任务 {} (设备: {}) 进度图片保存请求已提交", task.getId(), task.getMachineId());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.warn("任务 {} 处理被中断", task.getId());
break;
} catch (Exception e) {
log.error("处理任务 {} 进度图片保存时发生异常", task.getId(), e);
}
}
log.debug("第 {} 批任务处理完成", batchNumber);
}
/**
* 手动触发保存所有进行中任务的图片(用于调试或紧急情况)
*/
public void saveAllProgressImages() {
log.info("手动触发进度图片保存");
saveProgressImages();
}
/**
* 为特定设备的任务保存进度图片
* @param deviceId 设备ID
*/
public void saveProgressImagesForDevice(String deviceId) {
try {
List<LinkTask> deviceTasks = linkTaskMapper.findByMachineIdAndStatus(deviceId, "LOGGED_IN");
if (deviceTasks.isEmpty()) {
log.debug("设备 {} 没有进行中的任务", deviceId);
return;
}
log.info("为设备 {} 的 {} 个任务保存进度图片", deviceId, deviceTasks.size());
imageTaskExecutor.execute(() -> {
for (LinkTask task : deviceTasks) {
try {
deviceTaskUpdateService.saveProgressImagesForTask(deviceId, task.getCodeNo());
Thread.sleep(2000); // 每个任务间延迟2秒
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
} catch (Exception e) {
log.error("为设备 {} 任务 {} 保存进度图片时发生异常", deviceId, task.getId(), e);
}
}
});
} catch (Exception e) {
log.error("为设备 {} 保存进度图片时发生异常", deviceId, e);
}
}
}