荣誉徽章消息加锁

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,6 +94,9 @@ 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;
distributedLockUtil.executeWithLock(lockKey, () -> {
// 检查用户是否已经拥有该徽章幂等处理 // 检查用户是否已经拥有该徽章幂等处理
BadgeBackpack existBadge = badgeBackpackService.query() BadgeBackpack existBadge = badgeBackpackService.query()
.eq(BadgeBackpack::getUserId, userId) .eq(BadgeBackpack::getUserId, userId)
@ -100,7 +105,7 @@ public class BadgeOperateListener implements MessageListener {
if (existBadge != null) { if (existBadge != null) {
log.warn("用户已拥有该徽章, 跳过发放, userId: {}, badgeId: {}", userId, badgeId); log.warn("用户已拥有该徽章, 跳过发放, userId: {}, badgeId: {}", userId, badgeId);
return; return null;
} }
BadgeBackpack badgeBackpack = badgeBackpackService.getByUserIdByBadgeId(userId, badgeId); BadgeBackpack badgeBackpack = badgeBackpackService.getByUserIdByBadgeId(userId, badgeId);
@ -108,7 +113,8 @@ public class BadgeOperateListener implements MessageListener {
badgeBackpackService.save(buildSaveUserBadgeBackpack(badgeId, userId)); badgeBackpackService.save(buildSaveUserBadgeBackpack(badgeId, userId));
userProfileGateway.removeCacheAll(userId); userProfileGateway.removeCacheAll(userId);
} }
return null;
});
} }
/** /**