荣誉徽章消息加锁
This commit is contained in:
parent
c9112adab5
commit
ca1eefc8be
@ -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;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user