day4

#实习

遇到问题:

MAVEN版本对应问题,改一个配置会引起其他的一起变,如下

D:apache-maven-3.9.9inmvn.cmd -Didea.version=2025.2.3 -Dmaven.ext.class.path=D:JetBrainsIntelliJ IDEA 2025.1.2pluginsmavenlibmaven-event-listener.jar -Djansi.passthrough=true -Dstyle.color=always -s D:apache-maven-3.9.9confsettings.xml -Dmaven.repo.local=D:MyJavamaven_repository clean -f pom.xml
[WARNING]
[WARNING] Some problems were encountered while building the effective settings
[WARNING] Unrecognised tag: 'profile' (position: START_TAG seen ... variables for plugins in the POM.
 |
 |-->
 <profile>... @191:13) @ D:apache-maven-3.9.9confsettings.xml, line 191, column 13
[WARNING] Unrecognised tag: 'profile' (position: START_TAG seen ... variables for plugins in the POM.
 |
 |-->
 <profile>... @191:13) @ D:apache-maven-3.9.9confsettings.xml, line 191, column 13
[WARNING]
[INFO] Scanning for projects...
[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[ERROR] 'dependencies.dependency.version' for org.springframework.ai:spring-ai-openai-spring-boot-starter:jar is missing. @ line 93, column 21
@
[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]
[ERROR] The project com.fj.report:fj-report-server:1.0.0 (D:OneDriveDesktopzskjj-report-serverpom.xml) has 1 error
[ERROR] 'dependencies.dependency.version' for org.springframework.ai:spring-ai-openai-spring-boot-starter:jar is missing. @ line 93, column 21
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException

可以去仓库服务 找对应的版本以及组号

提交代码:

循环查询转定时任务:

  • 添加定时任务配置 ScheduleConfig.java
package com.fj.report.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * 定时任务配置类
 * @author fj
 */

@Configuration
@EnableScheduling
public class ScheduleConfig {
}
  • 创建定时任务服务接口
package com.fj.report.service;

/**
 * 解析任务调度服务接口
 */
public interface ParseTaskScheduleService {

    /**
     * 定时扫描并处理待处理的解析任务
     */
    void scanAndProcessPendingTasks();
}
  • 实现定时任务服务接口
package com.fj.report.service.impl;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fj.report.entity.SysCaseFileParseTask;
import com.fj.report.service.ParseTaskScheduleService;
import com.fj.report.service.PdfRecognitionService;
import com.fj.report.service.SysCaseFileParseTaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

import static com.fj.report.common.comstants.CommonConstants.MAX_FILE_PARSE_TIMEOUT_MINUTES;

/**
 * 解析任务调度服务实现类
 *
 * @author fj
 */
@Service
@Slf4j
public class ParseTaskScheduleTaskImpl implements ParseTaskScheduleService {
    @Autowired
    private SysCaseFileParseTaskService sysCaseFileParseTaskService;
    @Autowired
    private PdfRecognitionService pdfRecognitionService;

    /**
     * 每 5 秒定时扫描并处理待处理的解析任务
     */
    @Scheduled(fixedRate = 5000) // 每 5 秒执行一次
    @Override
    public void scanAndProcessPendingTasks() {
        log.debug("扫描并处理待处理的解析任务...");

        // 查询状态为 0(待处理) 和 1(处理中) 的任务
        LambdaQueryWrapper<SysCaseFileParseTask> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(SysCaseFileParseTask::getStatus, 0, 1)
                .orderByAsc(SysCaseFileParseTask::getCreateTime);

        List<SysCaseFileParseTask> tasks = sysCaseFileParseTaskService.list(wrapper);

        if(tasks.isEmpty()){
            log.debug("没有待处理的解析任务。");
            return;
        }

        //逐个处理任务
        for(SysCaseFileParseTask task : tasks){
            // 处理任务
            processTask(task);
        }
    }

    /**
     * 解析单个任务
     * @param task
     */
    private void processTask(SysCaseFileParseTask task) {
        log.info("处理解析任务:taskId={},status={}", task.getId(), task.getStatus());

        // 检查任务是否超时(超过30分钟)
        if(isTaskTimeout(task)){
            sysCaseFileParseTaskService.updateTaskFailed(task.getId(), "任务处理超时");
            return;
        }

        // 查询第三方状态
        String statusResult = pdfRecognitionService.queryDocParsingStatus(task.getThirdPlatformTaskId());

        if(statusResult == null){
            return;
        }

        // 解析状态
        JSONObject statusJson = JSON.parseObject(statusResult);
        JSONObject data = statusJson.getJSONObject("data");
        if(data == null){
            return;
        }

        String status = data.getString("status");
        Integer numberOfSuccessfulParsing = data.getInteger("numberOfSuccessfulParsing");

        log.info("任务状态:taskId={},status={},numberOfSuccessfulParsing={}",
                task.getId(), status, numberOfSuccessfulParsing);

        // 根据任务状态进行处理
        handleTaskStatus(task, status, numberOfSuccessfulParsing, statusJson, data);
    }

    /**
     * 根据任务状态处理任务
     * @param task
     * @param status
     * @param numberOfSuccessfulParsing
     * @param statusJson
     * @param data
     */
    private void handleTaskStatus(SysCaseFileParseTask task, String status, Integer numberOfSuccessfulParsing,
                                  JSONObject statusJson, JSONObject data) {
        if("success".equalsIgnoreCase(status)){
            // 任务成功,获取解析结果
            sysCaseFileParseTaskService.fetchAndSaveResults(task.getId(), numberOfSuccessfulParsing);
        }else if("fail".equalsIgnoreCase(status)){
            // 任务失败,更新状态
            String failCode = data.getString("code");
            String failMessage = data.getString("message");
            if(failMessage == null){
                failMessage = statusJson.getString("Message");
            }
            if(failCode == null){
                failCode = statusJson.getString("Code");
            }

            sysCaseFileParseTaskService.updateTaskFailed(task.getId(), failCode, failMessage);
        }else if("processing".equalsIgnoreCase(status)){
            // 任务处理中,更新状态
            if(task.getStatus() != 1){
                sysCaseFileParseTaskService.updateTaskProcessing(task.getId());
            }
        }else if("init".equalsIgnoreCase(status)){
            // 任务初始化,保持待处理状态
            log.debug("任务处于初始化状态,保持待处理状态:taskId={}", task.getId());
        }
    }

    /**
     * 检查任务是否超时
     * @param task
     * @return
     */
    private boolean isTaskTimeout(SysCaseFileParseTask task) {
        LocalDateTime startTime = task.getProcessingStartTime();
        if(startTime == null){
            startTime = task.getCreateTime();
        }

        LocalDateTime now = LocalDateTime.now();
        long minutes = java.time.Duration.between(startTime, now).toMinutes();

        return minutes > MAX_FILE_PARSE_TIMEOUT_MINUTES; // 超过30分钟视为超时
    }
}
← 返回首页