| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- package cn.gov.customs.wxjy.task;
- import cn.gov.customs.wxjy.constants.TaskStatusEnum;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.scheduling.annotation.Scheduled;
- import org.springframework.stereotype.Component;
- import javax.annotation.PostConstruct;
- import java.util.Map;
- import java.util.concurrent.ConcurrentHashMap;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
- import java.util.concurrent.ThreadFactory;
- import java.util.concurrent.atomic.AtomicInteger;
- /**
- * 定时任务管理类
- * 负责调度和执行所有定时任务
- */
- @Component
- @Slf4j
- public class ScheduledTasks {
- // 任务执行线程池
- private ExecutorService taskExecutor;
- // 任务映射表
- private final Map<String, BaseBusinessTask<?>> taskMap = new ConcurrentHashMap<>();
- @Autowired(required = false)
- private PackCatalogTask packCatalogTask;
- @Autowired(required = false)
- private GoodsCatalogTask goodsCatalogTask;
- @Autowired(required = false)
- private ChemicalsCatalogTask chemicalsCatalogTask;
- /**
- * 初始化方法
- */
- @PostConstruct
- public void init() {
- // 创建任务执行线程池
- taskExecutor = Executors.newFixedThreadPool(5, new TaskThreadFactory());
- // 注册任务
- registerTasks();
- log.info("定时任务管理器初始化完成,已注册{}个任务", taskMap.size());
- }
- /**
- * 注册所有任务
- */
- private void registerTasks() {
- if (packCatalogTask != null) {
- taskMap.put(packCatalogTask.getTaskCode(), packCatalogTask);
- log.info("注册任务:{}", packCatalogTask.getTaskName());
- }
- if (goodsCatalogTask != null) {
- taskMap.put(goodsCatalogTask.getTaskCode(), goodsCatalogTask);
- log.info("注册任务:{}", goodsCatalogTask.getTaskName());
- }
- if (chemicalsCatalogTask != null) {
- taskMap.put(chemicalsCatalogTask.getTaskCode(), chemicalsCatalogTask);
- log.info("注册任务:{}", chemicalsCatalogTask.getTaskName());
- }
- }
- /**
- * 包装种类定时任务调度
- */
- @Scheduled(cron = "${task.cron.pack-catalog:30 * * * * ?}")
- public void schedulePackCatalogTask() {
- executeTask(packCatalogTask, "包装种类目录推送数据");
- }
- /**
- * 危险货物定时任务调度
- */
- // @Scheduled(cron = "${task.cron.goods-catalog:30 * * * * ?}")
- // public void scheduleGoodsCatalogTask() {
- // executeTask(goodsCatalogTask, "危险货物目录推送数据");
- // }
- /**
- * 危化品目录定时任务调度
- */
- // @Scheduled(cron = "${task.cron.chemicals-catalog:30 * * * * ?}")
- // public void scheduleChemicalsCatalogTask() {
- // executeTask(chemicalsCatalogTask, "危化品目录推送数据");
- // }
- /**
- * 执行任务
- */
- private void executeTask(BaseBusinessTask<?> task, String taskDescription) {
- if (task == null) {
- log.warn("任务未配置: {}", taskDescription);
- return;
- }
- String taskName = task.getTaskName();
- log.info("{}定时任务开始执行", taskName);
- // 提交任务到线程池执行
- taskExecutor.submit(() -> {
- long startTime = System.currentTimeMillis();
- TaskStatusEnum status = TaskStatusEnum.SUCCESS;
- String errorMsg = null;
- try {
- // 执行任务
- task.execute();
- log.info("{}定时任务执行完成,耗时:{}ms",
- taskName, System.currentTimeMillis() - startTime);
- } catch (Exception e) {
- status = TaskStatusEnum.FAILED;
- errorMsg = String.format("执行失败:%s", e.getMessage());
- log.error("{}定时任务执行异常,业务类型:{}",
- taskName, task.getTaskCode(), e);
- } finally {
- // 记录任务执行日志
- try {
- task.recordTaskLog(status, startTime, errorMsg);
- } catch (Exception logEx) {
- log.error("记录任务日志失败,任务:{}", taskName, logEx);
- }
- }
- });
- }
- /**
- * 任务线程工厂
- */
- private static class TaskThreadFactory implements ThreadFactory {
- private final AtomicInteger threadNumber = new AtomicInteger(1);
- private final String namePrefix = "task-thread-";
- @Override
- public Thread newThread(Runnable r) {
- Thread t = new Thread(r, namePrefix + threadNumber.getAndIncrement());
- t.setDaemon(true);
- t.setPriority(Thread.NORM_PRIORITY);
- return t;
- }
- }
- }
|