Authored by Lixiaodi

增加点击数统计功能:增加同步key

@@ -8,9 +8,13 @@ import java.util.Date; @@ -8,9 +8,13 @@ import java.util.Date;
8 import java.util.HashMap; 8 import java.util.HashMap;
9 import java.util.List; 9 import java.util.List;
10 import java.util.Map; 10 import java.util.Map;
  11 +import java.util.Random;
  12 +import java.util.concurrent.TimeUnit;
11 import java.util.concurrent.locks.Lock; 13 import java.util.concurrent.locks.Lock;
12 import java.util.concurrent.locks.ReentrantLock; 14 import java.util.concurrent.locks.ReentrantLock;
13 15
  16 +import javax.annotation.Resource;
  17 +
14 import org.apache.commons.lang3.StringUtils; 18 import org.apache.commons.lang3.StringUtils;
15 import org.slf4j.Logger; 19 import org.slf4j.Logger;
16 import org.slf4j.LoggerFactory; 20 import org.slf4j.LoggerFactory;
@@ -19,6 +23,7 @@ import org.springframework.dao.QueryTimeoutException; @@ -19,6 +23,7 @@ import org.springframework.dao.QueryTimeoutException;
19 import org.springframework.scheduling.annotation.Scheduled; 23 import org.springframework.scheduling.annotation.Scheduled;
20 import org.springframework.stereotype.Component; 24 import org.springframework.stereotype.Component;
21 25
  26 +import com.yoho.unions.common.redis.RedisValueCache;
22 import com.yoho.unions.dal.IUnionClickLogsDAO; 27 import com.yoho.unions.dal.IUnionClickLogsDAO;
23 import com.yoho.unions.dal.UnionClickCountDayMapper; 28 import com.yoho.unions.dal.UnionClickCountDayMapper;
24 import com.yoho.unions.dal.model.UnionClickCount; 29 import com.yoho.unions.dal.model.UnionClickCount;
@@ -41,34 +46,42 @@ public class UnionClickCountDayTask { @@ -41,34 +46,42 @@ public class UnionClickCountDayTask {
41 // 防止交错执行 46 // 防止交错执行
42 private Lock lock = new ReentrantLock(); 47 private Lock lock = new ReentrantLock();
43 48
  49 + @Resource
  50 + private RedisValueCache redisValueCache;
  51 +
44 // 每天01:30分执行 52 // 每天01:30分执行
45 @Scheduled(cron = "* 30 1 * * ?") 53 @Scheduled(cron = "* 30 1 * * ?")
46 //@Scheduled(cron = "* 0/2 * * * ?") 54 //@Scheduled(cron = "* 0/2 * * * ?")
47 public void run() { 55 public void run() {
48 -  
49 - try {  
50 - InetAddress addr = InetAddress.getLocalHost();  
51 - String ip = addr.getHostAddress();  
52 - logger.info("当前ip是:{}", ip);  
53 - if (!StringUtils.equals("172.31.70.253", ip)) {  
54 - logger.info("当前环境不是目标环境,不执行操作!");  
55 - return; 56 +
  57 + String key = "yh:union:uniontype:UnionClickCountDayTask:"
  58 + + formatDay.format(new Date(System.currentTimeMillis()));
  59 + String value = Long.toString(System.nanoTime()) + Long.toString(new Random().nextInt(Integer.MAX_VALUE));
  60 +
  61 + logger.info("UnionClickCountDayTask run time={} , exKey={}, exValue={}", format.format(new Date()), key, value);
  62 + redisValueCache.setIfAbsent(key, value);
  63 + String getValue = redisValueCache.get(key, String.class);
  64 + logger.info("UnionClickCountDayTask run time={} , getKeyValue={}", format.format(new Date()), getValue);
  65 + if (getValue != null && getValue.equals(value)) {
  66 + logger.info("UnionClickCountDayTask run time={} , redis lock success", format.format(new Date()));
  67 + try {
  68 + Calendar time = Calendar.getInstance();
  69 + time.set(Calendar.HOUR_OF_DAY, 0);
  70 + time.set(Calendar.MINUTE, 0);
  71 + time.set(Calendar.SECOND, 0);
  72 + time.set(Calendar.MILLISECOND, 0);
  73 + int dayStart = (int) (time.getTimeInMillis() / 1000);
  74 + int begin = dayStart - 24 * 60 * 60;
  75 + int end = dayStart;
  76 + exeTask(begin, end);
  77 + } finally {
  78 + logger.info("UnionClickCountDayTask run time={} , exe over set lock key timeout",
  79 + format.format(new Date()));
  80 + redisValueCache.set(key, value, 1, TimeUnit.HOURS);
56 } 81 }
57 - } catch (UnknownHostException e1) {  
58 - logger.error("获取ip地址出错!");  
59 - return; 82 + } else {
  83 + logger.info("UnionClickCountDayTask run time={} , redis can not get lock", format.format(new Date()));
60 } 84 }
61 -  
62 - Calendar time = Calendar.getInstance();  
63 - time.set(Calendar.HOUR_OF_DAY, 0);  
64 - time.set(Calendar.MINUTE, 0);  
65 - time.set(Calendar.SECOND, 0);  
66 - time.set(Calendar.MILLISECOND, 0);  
67 - int dayStart = (int) (time.getTimeInMillis() / 1000);  
68 - int begin = dayStart - 24 * 60 * 60;  
69 - int end = dayStart;  
70 -  
71 - exeTask(begin, end);  
72 } 85 }
73 86
74 public String exeTask(int begin, int end) { 87 public String exeTask(int begin, int end) {