ActivityCollectionService.java 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package com.izouma.nineth.service;
  2. import com.izouma.nineth.annotations.Debounce;
  3. import com.izouma.nineth.config.GeneralProperties;
  4. import com.izouma.nineth.config.RedisKeys;
  5. import com.izouma.nineth.domain.ActivityCollection;
  6. import com.izouma.nineth.dto.PageQuery;
  7. import com.izouma.nineth.repo.ActivityCollectionRepo;
  8. import com.izouma.nineth.utils.JpaUtils;
  9. import lombok.AllArgsConstructor;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.apache.rocketmq.spring.core.RocketMQTemplate;
  12. import org.springframework.data.domain.Page;
  13. import org.springframework.data.redis.core.BoundValueOperations;
  14. import org.springframework.data.redis.core.RedisTemplate;
  15. import org.springframework.stereotype.Service;
  16. import java.util.Optional;
  17. import java.util.concurrent.TimeUnit;
  18. @Slf4j
  19. @Service
  20. @AllArgsConstructor
  21. public class ActivityCollectionService {
  22. private ActivityCollectionRepo activityCollectionRepo;
  23. private RedisTemplate<String, Object> redisTemplate;
  24. private CacheService cacheService;
  25. private RocketMQTemplate rocketMQTemplate;
  26. private GeneralProperties generalProperties;
  27. public Page<ActivityCollection> all(PageQuery pageQuery) {
  28. return activityCollectionRepo.findAll(JpaUtils.toSpecification(pageQuery, ActivityCollection.class), JpaUtils.toPageRequest(pageQuery));
  29. }
  30. public synchronized Long increaseStock(Long id, int number) {
  31. BoundValueOperations<String, Object> ops = redisTemplate.boundValueOps(RedisKeys.MINT_ACTIVITY_STOCK + id);
  32. if (ops.get() == null) {
  33. Boolean success = ops.setIfAbsent(Optional.ofNullable(activityCollectionRepo.getStock(id))
  34. .orElse(0), 7, TimeUnit.DAYS);
  35. log.info("创建redis铸造活动库存:{}", success);
  36. }
  37. Long stock = ops.increment(number);
  38. rocketMQTemplate.convertAndSend(generalProperties.getUpdateActivityStockTopic(), id);
  39. return stock;
  40. }
  41. @Debounce(key = "#id", delay = 500)
  42. public void syncStock(Long id) {
  43. Integer stock = (Integer) redisTemplate.opsForValue().get(RedisKeys.MINT_ACTIVITY_STOCK + id);
  44. if (stock != null) {
  45. log.info("同步铸造活动库存信息{}", id);
  46. activityCollectionRepo.updateStock(id, stock);
  47. cacheService.clearActivityCollection(id);
  48. }
  49. }
  50. }