Commit fbb63ee262c84d43aa2cc1e0782e5047ea26d3fd
1 parent
47ba5b7b
mall + pay:
1. 修复 PayNotifyTask 首次通知时,可能会失败的情况;原因:MySQL 时间的精度问题;
Showing
1 changed file
with
5 additions
and
4 deletions
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 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 4 | import cn.hutool.core.exceptions.ExceptionUtil; |
| 5 | +import cn.hutool.core.util.ObjectUtil; | |
| 5 | 6 | import cn.hutool.http.HttpResponse; |
| 6 | 7 | import cn.hutool.http.HttpUtil; |
| 7 | 8 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| ... | ... | @@ -42,7 +43,6 @@ import java.util.concurrent.CountDownLatch; |
| 42 | 43 | import java.util.concurrent.TimeUnit; |
| 43 | 44 | |
| 44 | 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 | 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 | 167 | payNotifyLockCoreRedisDAO.lock(task.getId(), NOTIFY_TIMEOUT_MILLIS, () -> { |
| 168 | 168 | // 校验,当前任务是否已经被通知过 |
| 169 | 169 | // 虽然已经通过分布式加锁,但是可能同时满足通知的条件,然后都去获得锁。此时,第一个执行完后,第二个还是能拿到锁,然后会再执行一次。 |
| 170 | + // 因此,此处我们通过第 notifyTimes 通知次数是否匹配来判断 | |
| 170 | 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 | 175 | return; |
| 175 | 176 | } |
| 176 | 177 | ... | ... |