package com.smppw.modaq.application.task; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.exceptions.ExceptionUtil; import com.smppw.modaq.application.service.EmailParseApiService; import com.smppw.modaq.common.conts.EmailTypeConst; import com.smppw.modaq.domain.entity.TaskRecordDO; import com.smppw.modaq.domain.service.TaskRecordService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Date; @Component @EnableScheduling public class ParseSchedulerTask { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final EmailParseApiService emailParseApiService; private final TaskRecordService taskRecordService; public ParseSchedulerTask(EmailParseApiService emailParseApiService, TaskRecordService taskRecordService) { this.emailParseApiService = emailParseApiService; this.taskRecordService = taskRecordService; } // @PostConstruct // public void executeOnStartup() { // this.letter(); //// this.report(); // } /** * 定时任务每2小时执行一次 */ @Scheduled(cron = "0 0 */1 * * ?") public void letter() { String taskKye = "mo_email_parser_letter_task"; TaskRecordDO task = this.taskRecordService.getTaskRecord(taskKye); if (task == null) { return; } long start = System.currentTimeMillis(); Date now = new Date(); try { // 尽可能往前找3分钟覆盖可能遗漏的邮件 Date startTime = DateUtil.offsetMinute(task.getStartTime(), -3); // 确认单从 INBOX 默认文件夹获取邮件 this.emailParseApiService.parseEmail(startTime, now, null, ListUtil.of(EmailTypeConst.REPORT_LETTER_EMAIL_TYPE)); task.setStatus(1); } catch (Exception e) { task.setStatus(2); task.setErrMsg(ExceptionUtil.stacktraceToString(e)); this.logger.error("任务{} 执行错误:{}", taskKye, ExceptionUtil.stacktraceToString(e)); } finally { task.setEndTime(now); this.taskRecordService.updateStatus(task); if (this.logger.isInfoEnabled()) { this.logger.info("任务{} 执行完成,耗时:{}ms", taskKye, System.currentTimeMillis() - start); } } } /** * 定时任务每1小时执行一次 */ @Scheduled(cron = "0 30 */2 * * ?") public void report() { String taskKye = "mo_email_parser_report_task"; TaskRecordDO task = this.taskRecordService.getTaskRecord(taskKye); if (task == null) { return; } long start = System.currentTimeMillis(); Date now = new Date(); try { // 尽可能往前找3分钟覆盖可能遗漏的邮件 Date startTime = DateUtil.offsetMinute(task.getStartTime(), -3); // 定期报告从 我的文件夹.报告公告 文件夹获取邮件 this.emailParseApiService.parseEmail(startTime, now, ListUtil.of("INBOX", "其他文件夹/报告公告"), EmailTypeConst.REPORT_EMAIL_TYPES); task.setStatus(1); } catch (Exception e) { task.setStatus(2); task.setErrMsg(ExceptionUtil.stacktraceToString(e)); this.logger.error("定期报告解析任务{} 执行错误:{}", taskKye, ExceptionUtil.stacktraceToString(e)); } finally { task.setEndTime(now); this.taskRecordService.updateStatus(task); if (this.logger.isInfoEnabled()) { this.logger.info("定期报告解析任务{} 执行完成,耗时:{}ms", taskKye, System.currentTimeMillis() - start); } } } }