荣誉徽章消息加锁

This commit is contained in:
tianfeng 2025-11-21 16:36:51 +08:00
parent c9112adab5
commit ca1eefc8be

View File

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