package com.izouma.nineth.service; import com.izouma.nineth.annotations.Debounce; import com.izouma.nineth.config.GeneralProperties; import com.izouma.nineth.config.RedisKeys; import com.izouma.nineth.domain.ActivityCollection; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.repo.ActivityCollectionRepo; import com.izouma.nineth.utils.JpaUtils; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.data.domain.Page; import org.springframework.data.redis.core.BoundValueOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import java.util.Optional; import java.util.concurrent.TimeUnit; @Slf4j @Service @AllArgsConstructor public class ActivityCollectionService { private ActivityCollectionRepo activityCollectionRepo; private RedisTemplate redisTemplate; private CacheService cacheService; private RocketMQTemplate rocketMQTemplate; private GeneralProperties generalProperties; public Page all(PageQuery pageQuery) { return activityCollectionRepo.findAll(JpaUtils.toSpecification(pageQuery, ActivityCollection.class), JpaUtils.toPageRequest(pageQuery)); } public synchronized Long increaseStock(Long id, int number) { BoundValueOperations ops = redisTemplate.boundValueOps(RedisKeys.MINT_ACTIVITY_STOCK + id); if (ops.get() == null) { Boolean success = ops.setIfAbsent(Optional.ofNullable(activityCollectionRepo.getStock(id)) .orElse(0), 7, TimeUnit.DAYS); log.info("创建redis铸造活动库存:{}", success); } Long stock = ops.increment(number); rocketMQTemplate.convertAndSend(generalProperties.getUpdateActivityStockTopic(), id); return stock; } @Debounce(key = "#id", delay = 500) public void syncStock(Long id) { Integer stock = (Integer) redisTemplate.opsForValue().get(RedisKeys.MINT_ACTIVITY_STOCK + id); if (stock != null) { log.info("同步铸造活动库存信息{}", id); activityCollectionRepo.updateStock(id, stock); cacheService.clearActivityCollection(id); } } }