Commit fbb63ee262c84d43aa2cc1e0782e5047ea26d3fd

Authored by YunaiV
1 parent 47ba5b7b

mall + pay:

1. 修复 PayNotifyTask 首次通知时,可能会失败的情况;原因:MySQL 时间的精度问题;
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/notify/PayNotifyServiceImpl.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.service.notify; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pay.service.notify;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.exceptions.ExceptionUtil; 4 import cn.hutool.core.exceptions.ExceptionUtil;
  5 +import cn.hutool.core.util.ObjectUtil;
5 import cn.hutool.http.HttpResponse; 6 import cn.hutool.http.HttpResponse;
6 import cn.hutool.http.HttpUtil; 7 import cn.hutool.http.HttpUtil;
7 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 8 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
@@ -42,7 +43,6 @@ import java.util.concurrent.CountDownLatch; @@ -42,7 +43,6 @@ import java.util.concurrent.CountDownLatch;
42 import java.util.concurrent.TimeUnit; 43 import java.util.concurrent.TimeUnit;
43 44
44 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime; 45 import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.addTime;
45 -import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.afterNow;  
46 import static cn.iocoder.yudao.module.pay.framework.job.config.PayJobConfiguration.NOTIFY_THREAD_POOL_TASK_EXECUTOR; 46 import static cn.iocoder.yudao.module.pay.framework.job.config.PayJobConfiguration.NOTIFY_THREAD_POOL_TASK_EXECUTOR;
47 47
48 /** 48 /**
@@ -167,10 +167,11 @@ public class PayNotifyServiceImpl implements PayNotifyService { @@ -167,10 +167,11 @@ public class PayNotifyServiceImpl implements PayNotifyService {
167 payNotifyLockCoreRedisDAO.lock(task.getId(), NOTIFY_TIMEOUT_MILLIS, () -> { 167 payNotifyLockCoreRedisDAO.lock(task.getId(), NOTIFY_TIMEOUT_MILLIS, () -> {
168 // 校验,当前任务是否已经被通知过 168 // 校验,当前任务是否已经被通知过
169 // 虽然已经通过分布式加锁,但是可能同时满足通知的条件,然后都去获得锁。此时,第一个执行完后,第二个还是能拿到锁,然后会再执行一次。 169 // 虽然已经通过分布式加锁,但是可能同时满足通知的条件,然后都去获得锁。此时,第一个执行完后,第二个还是能拿到锁,然后会再执行一次。
  170 + // 因此,此处我们通过第 notifyTimes 通知次数是否匹配来判断
170 PayNotifyTaskDO dbTask = payNotifyTaskMapper.selectById(task.getId()); 171 PayNotifyTaskDO dbTask = payNotifyTaskMapper.selectById(task.getId());
171 - if (afterNow(dbTask.getNextNotifyTime())) {  
172 - log.info("[executeNotifySync][dbTask({}) 任务被忽略,原因是未到达下次通知时间,可能是因为并发执行了]",  
173 - JsonUtils.toJsonString(dbTask)); 172 + if (ObjectUtil.notEqual(task.getNotifyTimes(), dbTask.getNotifyTimes())) {
  173 + log.warn("[executeNotifySync][task({}) 任务被忽略,原因是它的通知不是第 ({}) 次,可能是因为并发执行了]",
  174 + JsonUtils.toJsonString(task), dbTask.getNotifyTimes());
174 return; 175 return;
175 } 176 }
176 177