admin
2020-05-19 744594ef1a2f530fc3e86ea9dc48b62247f79420
fanli/src/main/java/com/yeshi/fanli/aspect/ActiveUserAspect.java
@@ -1,21 +1,41 @@
package com.yeshi.fanli.aspect;
import java.lang.reflect.Method;
import java.util.Date;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.core.task.TaskExecutor;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.yeshi.utils.NumberUtil;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.user.UserSystemCouponService;
import com.yeshi.fanli.util.RedisManager;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.yeshi.fanli.dto.mq.user.UserTopicTagEnum;
import com.yeshi.fanli.dto.mq.user.body.UserActiveMQMsg;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoModifyRecordService;
import com.yeshi.fanli.service.inter.user.integral.IntegralGetService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.ThreadUtil;
import com.yeshi.fanli.util.annotation.UserActive;
import com.yeshi.fanli.util.rocketmq.MQMsgBodyFactory;
import com.yeshi.fanli.util.rocketmq.MQTopicName;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.params.SetParams;
/**
 * 活跃用户处理
@@ -23,95 +43,84 @@
 * @author Administrator
 *
 */
//@Component
//@Aspect
//@Order(6)
@Component
@Aspect
public class ActiveUserAspect {
   @Resource(name = "taskExecutor")
   private TaskExecutor executor;
   @Resource
   private JedisPool jedisPool;
   @Resource
   private RedisManager redisManager;
   private UserInfoModifyRecordService userInfoModifyRecordService;
   @Resource
   private UserSystemCouponService userSystemCouponService;
   private UserInfoExtraService userInfoExtraService;
   @Resource
   private IntegralGetService integralGetService;
   
   public static final String EDP = "execution(* com.yeshi.fanli.controller.client.*.*(..))";
   @Resource(name = "producer")
   private Producer producer;
   @Around(EDP)
   public Object activeAround(ProceedingJoinPoint joinPoint) throws Throwable {
   private ExpressionParser parser = new SpelExpressionParser();
      ServletRequestAttributes servletContainer = (ServletRequestAttributes) RequestContextHolder
            .getRequestAttributes();
      final Object[] args = joinPoint.getArgs();
      final HttpServletRequest request = servletContainer.getRequest();
      executor.execute(new Runnable() {
         @Override
         public void run() {
            AcceptData acceptData = null;
            for (Object argsobj : args) {
               if (argsobj instanceof AcceptData) {
                  acceptData = (AcceptData) argsobj;
               }
            }
            // 自动领取券-系统发放
            receivedPushCoupon(acceptData, request);
         }
      });
      return joinPoint.proceed(args);
   private DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();
   public String generateKeyBySpEL(String spELString, JoinPoint joinPoint) {
      MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
      String[] paramNames = nameDiscoverer.getParameterNames(methodSignature.getMethod());
      Expression expression = parser.parseExpression(spELString);
      EvaluationContext context = new StandardEvaluationContext();
      Object[] args = joinPoint.getArgs();
      for (int i = 0; i < args.length; i++) {
         context.setVariable(paramNames[i], args[i]);
      }
      return expression.getValue(context).toString();
   }
   /**
    * 使用中  自动领取系统推送券
    * @param acceptData
    * @param request
    */
   public void receivedPushCoupon(AcceptData acceptData, HttpServletRequest request) {
   public static final String EDP = "execution(* com.yeshi.fanli.controller.client.*.*.*(..))";
      if (acceptData == null) {
         return;
      }
      String strUid = request.getParameter("uid");
      if (strUid == null || strUid.trim().length() == 0) {
         return;
      }
   @Before(EDP)
   public void activeBefore(JoinPoint joinPoint) {
      try {
         Long uid = Long.parseLong(strUid);
         // 缓存中是否存在uid
         String key = "activeUid_" + uid;
         String cacheValue = redisManager.getCommonString(key);
         if (cacheValue != null && cacheValue.trim().length() > 0) {
            return;
         Signature signature = joinPoint.getSignature();
         MethodSignature methodSignature = (MethodSignature) signature;
         Method targetMethod = methodSignature.getMethod();
         Method realMethod = joinPoint.getTarget().getClass().getDeclaredMethod(joinPoint.getSignature().getName(),
               targetMethod.getParameterTypes());
         if (realMethod.isAnnotationPresent(UserActive.class)) {
            UserActive rs = realMethod.getAnnotation(UserActive.class);
            String uidStr = generateKeyBySpEL(rs.uid(), joinPoint);
            if (!StringUtil.isNullOrEmpty(uidStr) && NumberUtil.isNumeric(uidStr)) {
               ThreadUtil.run(new Runnable() {
                  @Override
                  public void run() {
                     String key = "useractive-" + uidStr;
                     Jedis jedis = jedisPool.getResource();
                     try {
                        if (!StringUtil.isNullOrEmpty(jedis.set(key, "1", new SetParams().nx().ex(Constant.IS_TEST?10:300)))) {
                           try {
//                              Long uid = Long.parseLong(uidStr);
//                              if (!Constant.IS_TEST) { // 活跃通知
//                                 UserActiveMQMsg msg = new UserActiveMQMsg(uid, new Date());
//                                 Message message = MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.userActve, msg);
//                                 message.setStartDeliverTime(System.currentTimeMillis()+1000*10L);//10s后发送活跃消息
//                                 producer.send(message);
//                              }
                           } catch (Exception e) {
                           }
                        }
                     } finally {
                        jedis.close();
                     }
                  }
               });
            }
         }
         // 加入缓存 20分钟
         redisManager.cacheCommonString("activeUid_" + uid, strUid, 60 * 20);
         // 接收券
         userSystemCouponService.receivedCoupon(uid);
      } catch (Exception e) {
         try {
            LogHelper.errorDetailInfo(e);
         } catch (Exception e1) {
            e1.printStackTrace();
         }
      }
   }
}