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,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 |