refactor: 移除图片保存相关逻辑,直接更新任务状态为完成
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user