diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/BadgeOperateListener.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/BadgeOperateListener.java index 77020b31..5cba52ac 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/BadgeOperateListener.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/listener/BadgeOperateListener.java @@ -9,6 +9,7 @@ import com.red.circle.component.mq.service.ConsumerMessage; import com.red.circle.component.mq.service.MessageListener; import com.red.circle.mq.business.model.event.BadgeOperateEvent; import com.red.circle.mq.rocket.business.streams.BadgeOperateSink; +import com.red.circle.other.app.util.DistributedLockUtil; import com.red.circle.other.domain.gateway.user.UserProfileGateway; import com.red.circle.other.domain.model.user.UserProfile; import com.red.circle.other.infra.database.rds.entity.badge.BadgeBackpack; @@ -42,6 +43,7 @@ public class BadgeOperateListener implements MessageListener { private final BadgeBackpackService badgeBackpackService; private final MessageEventProcess messageEventProcess; private final UserProfileGateway userProfileGateway; + private final DistributedLockUtil distributedLockUtil; @Override public Action consume(ConsumerMessage message) { @@ -92,23 +94,27 @@ public class BadgeOperateListener implements MessageListener { * 佩戴徽章. */ private void handleWearBadge(Long userId, Long badgeId) { - // 检查用户是否已经拥有该徽章(幂等处理) - BadgeBackpack existBadge = badgeBackpackService.query() - .eq(BadgeBackpack::getUserId, userId) - .eq(BadgeBackpack::getBadgeId, badgeId) - .getOne(); + String lockKey = "badge:operate:wear:" + userId + ":" + badgeId; + + distributedLockUtil.executeWithLock(lockKey, () -> { + // 检查用户是否已经拥有该徽章(幂等处理) + BadgeBackpack existBadge = badgeBackpackService.query() + .eq(BadgeBackpack::getUserId, userId) + .eq(BadgeBackpack::getBadgeId, badgeId) + .getOne(); - if (existBadge != null) { - log.warn("用户已拥有该徽章, 跳过发放, userId: {}, badgeId: {}", userId, badgeId); - return; - } - - BadgeBackpack badgeBackpack = badgeBackpackService.getByUserIdByBadgeId(userId, badgeId); - if (Objects.isNull(badgeBackpack)) { - badgeBackpackService.save(buildSaveUserBadgeBackpack(badgeId, userId)); - userProfileGateway.removeCacheAll(userId); - } + if (existBadge != null) { + log.warn("用户已拥有该徽章, 跳过发放, userId: {}, badgeId: {}", userId, badgeId); + return null; + } + BadgeBackpack badgeBackpack = badgeBackpackService.getByUserIdByBadgeId(userId, badgeId); + if (Objects.isNull(badgeBackpack)) { + badgeBackpackService.save(buildSaveUserBadgeBackpack(badgeId, userId)); + userProfileGateway.removeCacheAll(userId); + } + return null; + }); } /**