Browse Source

在线人数计算

xiatian 6 years ago
parent
commit
7fa1a71e89
14 changed files with 481 additions and 0 deletions
  1. 125 0
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/online/ActiveDataUtil.java
  2. 42 0
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/online/ExamStudentActive.java
  3. 33 0
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/online/OnlineCount.java
  4. 35 0
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/online/StudentActive.java
  5. 35 0
      examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/online/UserActive.java
  6. 5 0
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/ExamStudentCountService.java
  7. 5 0
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/StudentCountService.java
  8. 5 0
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/UserCountService.java
  9. 37 0
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/impl/ExamStudentCountServiceImpl.java
  10. 36 0
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/impl/StudentCountServiceImpl.java
  11. 36 0
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/impl/UserCountServiceImpl.java
  12. 29 0
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/ExamStudentOnlineCountTask.java
  13. 29 0
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/StudentOnlineCountTask.java
  14. 29 0
      examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/UserOnlineCountTask.java

+ 125 - 0
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/online/ActiveDataUtil.java

@@ -0,0 +1,125 @@
+package cn.com.qmth.examcloud.task.base.online;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ActiveDataUtil {
+	private final static String spe="_";
+	private final static Long defTimeOut=5*60*1000L;
+	private final static Map<String, Map<Long, Long>> userActiveData = new ConcurrentHashMap<String, Map<Long, Long>>();
+	private final static Map<String, Map<Long, Long>> studentActiveData = new ConcurrentHashMap<String, Map<Long, Long>>();
+	private final static Map<String, Map<Long, Long>> examStudentActiveData = new ConcurrentHashMap<String, Map<Long, Long>>();
+
+	public static void updateUserActive(UserActive ac) {
+		String key = ac.getKey(spe);
+		Map<Long, Long> map = userActiveData.get(key);
+		if (map == null) {
+			map = new ConcurrentHashMap<Long, Long>();
+			userActiveData.put(key, map);
+		}
+		map.put(ac.getUserId(), ac.getActiveTime());
+	}
+	public static void updateStudentActive(StudentActive ac) {
+		String key = ac.getKey(spe);
+		Map<Long, Long> map = studentActiveData.get(key);
+		if (map == null) {
+			map = new ConcurrentHashMap<Long, Long>();
+			studentActiveData.put(key, map);
+		}
+		map.put(ac.getStudentId(), ac.getActiveTime());
+	}
+	public static void updateExamStudentActive(ExamStudentActive ac) {
+		String key = ac.getKey(spe);
+		Map<Long, Long> map = examStudentActiveData.get(key);
+		if (map == null) {
+			map = new ConcurrentHashMap<Long, Long>();
+			examStudentActiveData.put(key, map);
+		}
+		map.put(ac.getExamStudentId(), ac.getActiveTime());
+	}
+	private static void clearTimeOutUserActive(Long timeOut) {
+		if(timeOut==null) {
+			timeOut=defTimeOut;
+		}
+		Date d=new Date();
+		Long now=d.getTime();
+		for(Map<Long, Long> map:userActiveData.values()) {
+			for(Long k:map.keySet()) {
+				if(now-map.get(k)>timeOut) {
+					map.remove(k);
+				}
+			}
+		}
+	}
+	private static void clearTimeOutStudentActive(Long timeOut) {
+		if(timeOut==null) {
+			timeOut=defTimeOut;
+		}
+		Date d=new Date();
+		Long now=d.getTime();
+		for(Map<Long, Long> map:studentActiveData.values()) {
+			for(Long k:map.keySet()) {
+				if(now-map.get(k)>timeOut) {
+					map.remove(k);
+				}
+			}
+		}
+	}
+	private static void clearTimeOutExamStudentActive(Long timeOut) {
+		if(timeOut==null) {
+			timeOut=defTimeOut;
+		}
+		Date d=new Date();
+		Long now=d.getTime();
+		for(Map<Long, Long> map:examStudentActiveData.values()) {
+			for(Long k:map.keySet()) {
+				if(now-map.get(k)>timeOut) {
+					map.remove(k);
+				}
+			}
+		}
+	}
+	public static List<OnlineCount> getUserCount(Long timeOut){
+		clearTimeOutUserActive(timeOut);
+		List<OnlineCount> ret=new ArrayList<OnlineCount>();
+		for(String key:userActiveData.keySet()) {
+			OnlineCount oc=new OnlineCount();
+			String[] ks=key.split(spe);
+			oc.setRootOrgId(Long.valueOf(ks[0]));
+			oc.setOrgId(Long.valueOf(ks[1]));
+			oc.setOnlineCount(userActiveData.get(key).size());
+			ret.add(oc);
+		}
+		return ret;
+	}
+	public static List<OnlineCount> getStudentCount(Long timeOut){
+		clearTimeOutStudentActive(timeOut);
+		List<OnlineCount> ret=new ArrayList<OnlineCount>();
+		for(String key:studentActiveData.keySet()) {
+			OnlineCount oc=new OnlineCount();
+			String[] ks=key.split(spe);
+			oc.setRootOrgId(Long.valueOf(ks[0]));
+			oc.setOrgId(Long.valueOf(ks[1]));
+			oc.setOnlineCount(studentActiveData.get(key).size());
+			ret.add(oc);
+		}
+		return ret;
+	}
+	public static List<OnlineCount> getExamStudentCount(Long timeOut){
+		clearTimeOutExamStudentActive(timeOut);
+		List<OnlineCount> ret=new ArrayList<OnlineCount>();
+		for(String key:examStudentActiveData.keySet()) {
+			OnlineCount oc=new OnlineCount();
+			String[] ks=key.split(spe);
+			oc.setRootOrgId(Long.valueOf(ks[0]));
+			oc.setOrgId(Long.valueOf(ks[1]));
+			oc.setExamId(Long.valueOf(ks[2]));
+			oc.setOnlineCount(examStudentActiveData.get(key).size());
+			ret.add(oc);
+		}
+		return ret;
+	}
+}

+ 42 - 0
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/online/ExamStudentActive.java

@@ -0,0 +1,42 @@
+package cn.com.qmth.examcloud.task.base.online;
+
+public class ExamStudentActive {
+	private Long rootOrgId;
+	private Long orgId;
+	private Long examId;
+	private Long examStudentId;
+	private Long activeTime;
+	public Long getRootOrgId() {
+		return rootOrgId;
+	}
+	public void setRootOrgId(Long rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+	public Long getOrgId() {
+		return orgId;
+	}
+	public void setOrgId(Long orgId) {
+		this.orgId = orgId;
+	}
+	public Long getExamId() {
+		return examId;
+	}
+	public void setExamId(Long examId) {
+		this.examId = examId;
+	}
+	public Long getExamStudentId() {
+		return examStudentId;
+	}
+	public void setExamStudentId(Long examStudentId) {
+		this.examStudentId = examStudentId;
+	}
+	public Long getActiveTime() {
+		return activeTime;
+	}
+	public void setActiveTime(Long activeTime) {
+		this.activeTime = activeTime;
+	}
+	public String getKey(String spe) {
+		return rootOrgId+spe+orgId+spe+examId;
+	}
+}

+ 33 - 0
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/online/OnlineCount.java

@@ -0,0 +1,33 @@
+package cn.com.qmth.examcloud.task.base.online;
+
+public class OnlineCount {
+	private Long examId;
+	private Long rootOrgId;
+	private Long orgId;
+	private Integer onlineCount;
+	public Long getRootOrgId() {
+		return rootOrgId;
+	}
+	public void setRootOrgId(Long rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+	public Long getOrgId() {
+		return orgId;
+	}
+	public void setOrgId(Long orgId) {
+		this.orgId = orgId;
+	}
+	public Integer getOnlineCount() {
+		return onlineCount;
+	}
+	public void setOnlineCount(Integer onlineCount) {
+		this.onlineCount = onlineCount;
+	}
+	public Long getExamId() {
+		return examId;
+	}
+	public void setExamId(Long examId) {
+		this.examId = examId;
+	}
+	
+}

+ 35 - 0
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/online/StudentActive.java

@@ -0,0 +1,35 @@
+package cn.com.qmth.examcloud.task.base.online;
+
+public class StudentActive {
+	private Long rootOrgId;
+	private Long orgId;
+	private Long studentId;
+	private Long activeTime;
+	public Long getRootOrgId() {
+		return rootOrgId;
+	}
+	public void setRootOrgId(Long rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+	public Long getOrgId() {
+		return orgId;
+	}
+	public void setOrgId(Long orgId) {
+		this.orgId = orgId;
+	}
+	public Long getStudentId() {
+		return studentId;
+	}
+	public void setStudentId(Long studentId) {
+		this.studentId = studentId;
+	}
+	public Long getActiveTime() {
+		return activeTime;
+	}
+	public void setActiveTime(Long activeTime) {
+		this.activeTime = activeTime;
+	}
+	public String getKey(String spe) {
+		return rootOrgId+spe+orgId;
+	}
+}

+ 35 - 0
examcloud-task-base/src/main/java/cn/com/qmth/examcloud/task/base/online/UserActive.java

@@ -0,0 +1,35 @@
+package cn.com.qmth.examcloud.task.base.online;
+
+public class UserActive {
+	private Long rootOrgId;
+	private Long orgId;
+	private Long userId;
+	private Long activeTime;
+	public Long getRootOrgId() {
+		return rootOrgId;
+	}
+	public void setRootOrgId(Long rootOrgId) {
+		this.rootOrgId = rootOrgId;
+	}
+	public Long getOrgId() {
+		return orgId;
+	}
+	public void setOrgId(Long orgId) {
+		this.orgId = orgId;
+	}
+	public Long getUserId() {
+		return userId;
+	}
+	public void setUserId(Long userId) {
+		this.userId = userId;
+	}
+	public Long getActiveTime() {
+		return activeTime;
+	}
+	public void setActiveTime(Long activeTime) {
+		this.activeTime = activeTime;
+	}
+	public String getKey(String spe) {
+		return rootOrgId+spe+orgId;
+	}
+}

+ 5 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/ExamStudentCountService.java

@@ -0,0 +1,5 @@
+package cn.com.qmth.examcloud.task.service;
+
+public interface ExamStudentCountService {
+	public void saveOnlieCount();
+}

+ 5 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/StudentCountService.java

@@ -0,0 +1,5 @@
+package cn.com.qmth.examcloud.task.service;
+
+public interface StudentCountService {
+	public void saveOnlieCount();
+}

+ 5 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/UserCountService.java

@@ -0,0 +1,5 @@
+package cn.com.qmth.examcloud.task.service;
+
+public interface UserCountService {
+	public void saveOnlieCount();
+}

+ 37 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/impl/ExamStudentCountServiceImpl.java

@@ -0,0 +1,37 @@
+package cn.com.qmth.examcloud.task.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.core.reports.api.ExamStudentCountCloudService;
+import cn.com.qmth.examcloud.core.reports.api.request.AddOrUpdateExamStudentCountReq;
+import cn.com.qmth.examcloud.task.base.online.ActiveDataUtil;
+import cn.com.qmth.examcloud.task.base.online.OnlineCount;
+import cn.com.qmth.examcloud.task.service.ExamStudentCountService;
+
+@Service
+public class ExamStudentCountServiceImpl implements ExamStudentCountService {
+	@Autowired
+	private ExamStudentCountCloudService examStudentCountCloudService;
+
+	@Override
+	public void saveOnlieCount() {
+		List<OnlineCount> ret=ActiveDataUtil.getUserCount(null);
+		if(ret!=null) {
+			AddOrUpdateExamStudentCountReq req=new AddOrUpdateExamStudentCountReq();
+			Date now=new Date();
+			req.setBatchTime(now.getTime());
+			for(OnlineCount oc:ret) {
+				req.setRootOrgId(oc.getRootOrgId());
+				req.setOrgId(oc.getOrgId());
+				req.setExamId(oc.getExamId());
+				req.setOnlineCount(oc.getOnlineCount());
+				examStudentCountCloudService.addOrUpdateCount(req);
+			}
+		}
+	}
+
+}

+ 36 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/impl/StudentCountServiceImpl.java

@@ -0,0 +1,36 @@
+package cn.com.qmth.examcloud.task.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.core.reports.api.StudentCountCloudService;
+import cn.com.qmth.examcloud.core.reports.api.request.AddOrUpdateStudentCountReq;
+import cn.com.qmth.examcloud.task.base.online.ActiveDataUtil;
+import cn.com.qmth.examcloud.task.base.online.OnlineCount;
+import cn.com.qmth.examcloud.task.service.StudentCountService;
+
+@Service
+public class StudentCountServiceImpl implements StudentCountService {
+	@Autowired
+	private StudentCountCloudService studentCountCloudService;
+
+	@Override
+	public void saveOnlieCount() {
+		List<OnlineCount> ret=ActiveDataUtil.getUserCount(null);
+		if(ret!=null) {
+			AddOrUpdateStudentCountReq req=new AddOrUpdateStudentCountReq();
+			Date now=new Date();
+			req.setBatchTime(now.getTime());
+			for(OnlineCount oc:ret) {
+				req.setRootOrgId(oc.getRootOrgId());
+				req.setOrgId(oc.getOrgId());
+				req.setOnlineCount(oc.getOnlineCount());
+				studentCountCloudService.addOrUpdateCount(req);
+			}
+		}
+	}
+
+}

+ 36 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/impl/UserCountServiceImpl.java

@@ -0,0 +1,36 @@
+package cn.com.qmth.examcloud.task.service.impl;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.examcloud.core.reports.api.UserCountCloudService;
+import cn.com.qmth.examcloud.core.reports.api.request.AddOrUpdateUserCountReq;
+import cn.com.qmth.examcloud.task.base.online.ActiveDataUtil;
+import cn.com.qmth.examcloud.task.base.online.OnlineCount;
+import cn.com.qmth.examcloud.task.service.UserCountService;
+
+@Service
+public class UserCountServiceImpl implements UserCountService {
+	@Autowired
+	private UserCountCloudService userCountCloudService;
+
+	@Override
+	public void saveOnlieCount() {
+		List<OnlineCount> ret=ActiveDataUtil.getUserCount(null);
+		if(ret!=null) {
+			AddOrUpdateUserCountReq req=new AddOrUpdateUserCountReq();
+			Date now=new Date();
+			req.setBatchTime(now.getTime());
+			for(OnlineCount oc:ret) {
+				req.setRootOrgId(oc.getRootOrgId());
+				req.setOrgId(oc.getOrgId());
+				req.setOnlineCount(oc.getOnlineCount());
+				userCountCloudService.addOrUpdateCount(req);
+			}
+		}
+	}
+
+}

+ 29 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/ExamStudentOnlineCountTask.java

@@ -0,0 +1,29 @@
+package cn.com.qmth.examcloud.task.service.job;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.task.service.ExamStudentCountService;
+import cn.com.qmth.examcloud.web.task.AbstractTask;
+import cn.com.qmth.examcloud.web.task.ScheduleJob;
+import cn.com.qmth.examcloud.web.task.TaskTracker;
+
+@Component("examStudentOnlineCountTask")
+public class ExamStudentOnlineCountTask extends AbstractTask {
+
+	@Autowired
+	ExamStudentCountService examStudentCountService;
+
+	@Autowired
+	TaskTracker TaskTracker;
+	
+	@Override
+	public void run(ScheduleJob scheduleJob) throws Exception {
+		examStudentCountService.saveOnlieCount();
+	}
+
+	@Override
+	public TaskTracker getTaskTracker() {
+		return TaskTracker;
+	}
+}

+ 29 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/StudentOnlineCountTask.java

@@ -0,0 +1,29 @@
+package cn.com.qmth.examcloud.task.service.job;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.task.service.StudentCountService;
+import cn.com.qmth.examcloud.web.task.AbstractTask;
+import cn.com.qmth.examcloud.web.task.ScheduleJob;
+import cn.com.qmth.examcloud.web.task.TaskTracker;
+
+@Component("studentOnlineCountTask")
+public class StudentOnlineCountTask extends AbstractTask {
+
+	@Autowired
+	StudentCountService studentCountService;
+
+	@Autowired
+	TaskTracker TaskTracker;
+	
+	@Override
+	public void run(ScheduleJob scheduleJob) throws Exception {
+		studentCountService.saveOnlieCount();
+	}
+
+	@Override
+	public TaskTracker getTaskTracker() {
+		return TaskTracker;
+	}
+}

+ 29 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/UserOnlineCountTask.java

@@ -0,0 +1,29 @@
+package cn.com.qmth.examcloud.task.service.job;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.task.service.UserCountService;
+import cn.com.qmth.examcloud.web.task.AbstractTask;
+import cn.com.qmth.examcloud.web.task.ScheduleJob;
+import cn.com.qmth.examcloud.web.task.TaskTracker;
+
+@Component("userOnlineCountTask")
+public class UserOnlineCountTask extends AbstractTask {
+
+	@Autowired
+	UserCountService userCountService;
+
+	@Autowired
+	TaskTracker TaskTracker;
+	
+	@Override
+	public void run(ScheduleJob scheduleJob) throws Exception {
+		userCountService.saveOnlieCount();
+	}
+
+	@Override
+	public TaskTracker getTaskTracker() {
+		return TaskTracker;
+	}
+}