diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseCrontabServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseCrontabServiceImpl.java index 66ff0516..96ad6597 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseCrontabServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/base/service/impl/ShopBaseCrontabServiceImpl.java @@ -11,6 +11,8 @@ import com.suisung.mall.core.web.service.impl.BaseServiceImpl; import com.suisung.mall.shop.base.mapper.ShopBaseCrontabMapper; import com.suisung.mall.shop.base.service.ShopBaseCrontabService; import com.suisung.mall.shop.components.quartz.service.QuartzService; +import com.suisung.mall.shop.components.quartz.service.impl.QuartzServiceImpl; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,16 +26,16 @@ import org.springframework.transaction.annotation.Transactional; * @author Xinze * @since 2021-08-16 */ +@Slf4j @Service public class ShopBaseCrontabServiceImpl extends BaseServiceImpl implements ShopBaseCrontabService { - @Autowired - private QuartzService quartzService; - private final String JOB_NAME_PREFIX = "JOB_"; private final String TRIGGER_NAME_PREFIX = "TRIGGER_"; private final String JOB_GROUP_NAME = "DEFAULT_JOB_GROUP"; private final String TRIGGER_GROUP_NAME = "DEFAULT_TRIGGER_GROUP"; + @Autowired + private QuartzService quartzService; @Transactional @Override @@ -48,7 +50,7 @@ public class ShopBaseCrontabServiceImpl extends BaseServiceImpl return_ids = orderReturnService.getOnlineRefundReturnId(); - for (String return_id : return_ids) { - if (!orderReturnService.doOnlineRefund(return_id)) { - LogUtil.error(String.format("return_id: %s 原路退回出错", return_id)); - - // 处理异常标记 - } - } +// ShopOrderReturnService orderReturnService = SpringUtil.getBean(ShopOrderReturnService.class); +// +// // 获取支付宝/微信退款订单 +// List return_ids = orderReturnService.getOnlineRefundReturnId(); +// for (String return_id : return_ids) { +// if (!orderReturnService.doOnlineRefund(return_id)) { +// LogUtil.error(String.format("return_id: %s 原路退回出错", return_id)); +// +// // 处理异常标记 +// } +// } } } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/service/impl/QuartzServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/service/impl/QuartzServiceImpl.java index 35e4c278..4f284153 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/service/impl/QuartzServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/components/quartz/service/impl/QuartzServiceImpl.java @@ -4,12 +4,15 @@ import com.suisung.mall.common.exception.ApiException; import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.shop.components.quartz.service.QuartzService; import org.quartz.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class QuartzServiceImpl implements QuartzService { + private static final Logger logger = LoggerFactory.getLogger(QuartzServiceImpl.class); private final String PATH_PREFIX = "com.suisung.mall.shop.components.quartz.job."; @Autowired private Scheduler scheduler; @@ -26,63 +29,126 @@ public class QuartzServiceImpl implements QuartzService { */ @Override public void addJob(String jName, String jGroup, String tName, String tGroup, String cron, String cName) { + logger.info("[Quartz] 开始添加定时任务: 任务名称={}, 任务组={}, 触发器名称={}, 触发器组={}, cron表达式={}, 类名={}", + jName, jGroup, tName, tGroup, cron, cName); + // 1. 参数校验 if (jName == null || jName.trim().isEmpty()) { + logger.warn("[Quartz] 任务名称不能为空: {}", jName); throw new ApiException(I18nUtil._("任务名称不能为空!")); } if (jGroup == null || jGroup.trim().isEmpty()) { + logger.warn("[Quartz] 任务组不能为空: {}", jGroup); throw new ApiException(I18nUtil._("任务组不能为空!")); } if (tName == null || tName.trim().isEmpty()) { + logger.warn("[Quartz] 触发器名称不能为空: {}", tName); throw new ApiException(I18nUtil._("触发器名称不能为空!")); } if (tGroup == null || tGroup.trim().isEmpty()) { + logger.warn("[Quartz] 触发器组不能为空: {}", tGroup); throw new ApiException(I18nUtil._("触发器组不能为空!")); } if (cron == null || cron.trim().isEmpty()) { + logger.warn("[Quartz] cron表达式不能为空: {}", cron); throw new ApiException(I18nUtil._("cron表达式不能为空!")); } if (cName == null || cName.trim().isEmpty()) { + logger.warn("[Quartz] 任务实现类名称不能为空: {}", cName); throw new ApiException(I18nUtil._("任务实现类名称不能为空!")); } // 2. 加载任务类 Class clazz; try { - clazz = (Class) Class.forName(PATH_PREFIX + cName); + String fullClassName = PATH_PREFIX + cName; + logger.debug("[Quartz] 尝试加载任务类: {}", fullClassName); + clazz = (Class) Class.forName(fullClassName); + logger.debug("[Quartz] 成功加载任务类: {}", fullClassName); } catch (ClassNotFoundException e) { + logger.error("[Quartz] 定时任务脚本不存在!类名: {}{}", PATH_PREFIX, cName, e); throw new ApiException(I18nUtil._("定时任务脚本不存在!类名: " + PATH_PREFIX + cName), e); } try { // 3. 构建任务详情和触发器 + JobKey jobKey = new JobKey(jName, jGroup); JobDetail jobDetail = JobBuilder.newJob(clazz) - .withIdentity(jName, jGroup) + .withIdentity(jobKey) .build(); + TriggerKey triggerKey = new TriggerKey(tName, tGroup); CronTrigger trigger = TriggerBuilder.newTrigger() - .withIdentity(tName, tGroup) + .withIdentity(triggerKey) .startNow() .withSchedule(CronScheduleBuilder.cronSchedule(cron)) .build(); + logger.debug("[Quartz] 构建任务详情和触发器完成: jobKey={}, triggerKey={}", jobKey, triggerKey); + // 4. 检查任务是否已存在 - if (scheduler.checkExists(jobDetail.getKey())) { - scheduler.deleteJob(jobDetail.getKey()); + if (scheduler.checkExists(jobKey)) { + logger.info("[Quartz] 任务已存在,先删除旧任务: jobKey={}", jobKey); + scheduler.deleteJob(jobKey); } // 5. 调度任务 + logger.info("[Quartz] 开始调度任务: jobKey={}, triggerKey={}", jobKey, triggerKey); scheduler.scheduleJob(jobDetail, trigger); + logger.info("[Quartz] 任务调度成功: jobKey={}, triggerKey={}", jobKey, triggerKey); // 6. 启动调度器(如果尚未启动) if (!scheduler.isStarted()) { + logger.info("[Quartz] 调度器尚未启动,正在启动..."); scheduler.start(); + logger.info("[Quartz] 调度器启动成功"); } } catch (SchedulerException e) { + logger.error("[Quartz] 添加定时任务失败!任务名称={}, 任务组={}, 触发器名称={}, 触发器组={}", + jName, jGroup, tName, tGroup, e); + throw new ApiException(I18nUtil._("添加定时任务失败!"), e); + } catch (Exception e) { + logger.error("[Quartz] 添加定时任务时发生未知异常!任务名称={}, 任务组={}, 触发器名称={}, 触发器组={}", + jName, jGroup, tName, tGroup, e); throw new ApiException(I18nUtil._("添加定时任务失败!"), e); } } + /** + * 添加或更新任务,如果调度器中不存在任务则从数据库获取信息添加 + * + * @param jobName 任务名称 + * @param jobGroup 任务组 + * @param triggerName 触发器名称 + * @param triggerGroup 触发器组 + * @param dbCron 从数据库获取的cron表达式 + * @param dbJobClass 从数据库获取的任务类名 + * @return 是否添加成功 + */ + public boolean addOrUpdateJobFromDatabase(String jobName, String jobGroup, String triggerName, + String triggerGroup, String dbCron, String dbJobClass) { + logger.info("[Quartz] 尝试从数据库信息添加或更新任务: 任务名称={}, 任务组={}", jobName, jobGroup); + + try { + JobKey jobKey = new JobKey(jobName, jobGroup); + + // 检查任务是否已存在 + if (scheduler.checkExists(jobKey)) { + logger.debug("[Quartz] 任务已存在于调度器中: jobKey={}", jobKey); + return true; // 任务已存在,无需添加 + } + + // 任务不存在,从数据库信息创建新任务 + logger.info("[Quartz] 调度器中不存在任务,从数据库信息创建: jobKey={}", jobKey); + addJob(jobName, jobGroup, triggerName, triggerGroup, dbCron, dbJobClass); + return true; + } catch (Exception e) { + logger.error("[Quartz] 从数据库信息添加或更新任务失败: 任务名称={}, 任务组={}", jobName, jobGroup, e); + return false; + } + } + + /** * 暂停定时任务 * @@ -91,10 +157,24 @@ public class QuartzServiceImpl implements QuartzService { */ @Override public void pauseJob(String jName, String jGroup) { + logger.info("[Quartz] 开始暂停定时任务: 任务名称={}, 任务组={}", jName, jGroup); try { - scheduler.pauseJob(JobKey.jobKey(jName, jGroup)); + JobKey jobKey = JobKey.jobKey(jName, jGroup); + + // 检查任务是否存在,不存在则记录日志并返回,不抛出异常 + if (!scheduler.checkExists(jobKey)) { + logger.info("[Quartz] 任务不存在,无需暂停: jobKey={},可能任务已手动删除或尚未创建", jobKey); + return; + } + + scheduler.pauseJob(jobKey); + logger.info("[Quartz] 定时任务暂停成功: jobKey={}", jobKey); + } catch (SchedulerException e) { + logger.error("[Quartz] 暂停定时任务时发生调度异常!任务名称={}, 任务组={}", jName, jGroup, e); + // 即使暂停失败也继续执行,避免阻塞业务流程 } catch (Exception e) { - throw new ApiException(I18nUtil._("暂停定时任务失败!")); + logger.error("[Quartz] 暂停定时任务时发生未知异常!任务名称={}, 任务组={}", jName, jGroup, e); + // 即使暂停失败也继续执行,避免阻塞业务流程 } } @@ -106,10 +186,24 @@ public class QuartzServiceImpl implements QuartzService { */ @Override public void resumeJob(String jName, String jGroup) { + logger.info("[Quartz] 开始继续定时任务: 任务名称={}, 任务组={}", jName, jGroup); try { - scheduler.resumeJob(JobKey.jobKey(jName, jGroup)); + JobKey jobKey = JobKey.jobKey(jName, jGroup); + + // 检查任务是否存在,不存在则记录日志并返回,不抛出异常 + if (!scheduler.checkExists(jobKey)) { + logger.info("[Quartz] 任务不存在,无需继续: jobKey={},可能任务已手动删除或尚未创建", jobKey); + return; + } + + scheduler.resumeJob(jobKey); + logger.info("[Quartz] 定时任务继续成功: jobKey={}", jobKey); } catch (SchedulerException e) { - throw new ApiException(I18nUtil._("继续定时任务失败!")); + logger.error("[Quartz] 继续定时任务时发生调度异常!任务名称={}, 任务组={}", jName, jGroup, e); + // 即使继续失败也继续执行,避免阻塞业务流程 + } catch (Exception e) { + logger.error("[Quartz] 继续定时任务时发生未知异常!任务名称={}, 任务组={}", jName, jGroup, e); + // 即使继续失败也继续执行,避免阻塞业务流程 } } @@ -121,10 +215,30 @@ public class QuartzServiceImpl implements QuartzService { */ @Override public void deleteJob(String jName, String jGroup) { + logger.info("[Quartz] 开始删除定时任务: 任务名称={}, 任务组={}", jName, jGroup); try { - scheduler.deleteJob(JobKey.jobKey(jName, jGroup)); + JobKey jobKey = JobKey.jobKey(jName, jGroup); + + // 检查任务是否存在,不存在则记录日志并返回,不抛出异常 + if (!scheduler.checkExists(jobKey)) { + logger.info("[Quartz] 任务不存在,无需删除: jobKey={},可能任务已手动删除或尚未创建", jobKey); + return; + } + + boolean deleted = scheduler.deleteJob(jobKey); + if (deleted) { + logger.info("[Quartz] 定时任务删除成功: jobKey={}", jobKey); + } else { + logger.warn("[Quartz] 定时任务删除失败: jobKey={}", jobKey); + } } catch (SchedulerException e) { - throw new ApiException(I18nUtil._("删除定时任务失败!")); + logger.error("[Quartz] 删除定时任务时发生调度异常!任务名称={}, 任务组={}", jName, jGroup, e); + // 即使删除失败也继续执行,避免阻塞业务流程 + } catch (Exception e) { + logger.error("[Quartz] 删除定时任务时发生未知异常!任务名称={}, 任务组={}", jName, jGroup, e); + // 即使删除失败也继续执行,避免阻塞业务流程 } } + + } diff --git a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java index 7571e193..0d5a637d 100644 --- a/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java +++ b/mall-shop/src/main/java/com/suisung/mall/shop/lakala/service/impl/LklOrderSeparateServiceImpl.java @@ -160,11 +160,11 @@ public class LklOrderSeparateServiceImpl extends BaseServiceImpl getUnSuccessSeparateList(Date beginDate, Date endDate, Integer page, Integer size) { + public List getUnSuccessSeparateList(Date beginDate, Date endDate, Integer page, Integer pageSize) { // 1. 参数校验 if (beginDate == null) { log.warn("[分页查询未成功分账记录] 开始时间不能为空"); @@ -176,8 +176,8 @@ public class LklOrderSeparateServiceImpl extends BaseServiceImpl resultPage = page(new Page<>(page, size), queryWrapper); + Page resultPage = lists(queryWrapper, page, pageSize); List result = resultPage.getRecords(); log.info("[分页查询未成功分账记录] 查询完成,开始时间={},结束时间={},页码={},页面大小={},结果数量={}", - beginDate, actualEndDate, page, size, (result != null ? result.size() : 0)); + beginDate, actualEndDate, page, pageSize, (result != null ? result.size() : 0)); return result != null ? result : Collections.emptyList(); } catch (Exception e) { log.error("[分页查询未成功分账记录] 查询过程中发生异常,开始时间={},结束时间={},页码={},页面大小={}", - beginDate, endDate, page, size, e); + beginDate, endDate, page, pageSize, e); return Collections.emptyList(); } }