AssetSaveAspect.java 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package com.izouma.nineth.aspect;
  2. import com.izouma.nineth.domain.Asset;
  3. import com.izouma.nineth.service.UserAssetSummaryService;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.aspectj.lang.JoinPoint;
  6. import org.aspectj.lang.annotation.After;
  7. import org.aspectj.lang.annotation.Aspect;
  8. import org.springframework.stereotype.Component;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import java.util.Optional;
  12. import java.util.concurrent.Future;
  13. import java.util.concurrent.ScheduledExecutorService;
  14. import java.util.concurrent.TimeUnit;
  15. @Aspect
  16. @Component
  17. @Slf4j
  18. public class AssetSaveAspect {
  19. private final UserAssetSummaryService userAssetSummaryService;
  20. private final ScheduledExecutorService executorService;
  21. private final Map<Long, Future> futureMap;
  22. public AssetSaveAspect(UserAssetSummaryService userAssetSummaryService, ScheduledExecutorService executorService) {
  23. this.userAssetSummaryService = userAssetSummaryService;
  24. this.executorService = executorService;
  25. this.futureMap = new HashMap<>();
  26. }
  27. @After("execution(* com.izouma.nineth.repo.AssetRepo.save(..)) || execution(* com.izouma.nineth.repo.AssetRepo.saveAndFlush(..))")
  28. public void redisLock(JoinPoint joinPoint) {
  29. log.info("enter AssetSaveAspect");
  30. try {
  31. Asset asset = (Asset) joinPoint.getArgs()[0];
  32. log.info("recalculate user asset summary {}", asset.getUserId());
  33. synchronized (AssetSaveAspect.class) {
  34. Optional.ofNullable(futureMap.get(asset.getUserId()))
  35. .ifPresent(f -> {
  36. log.info("debouncing previous task {}", asset.getUserId());
  37. f.cancel(false);
  38. });
  39. futureMap.put(asset.getUserId(), executorService.schedule(() -> {
  40. userAssetSummaryService.calculateNum(asset.getUserId(), asset.getCompanyId());
  41. }, 500, TimeUnit.MILLISECONDS));
  42. }
  43. } catch (Exception e) {
  44. log.error("AssetSaveAspect error", e);
  45. }
  46. }
  47. }