|
@@ -0,0 +1,119 @@
|
|
|
+package com.mooctest.crowd.site.service.impl;
|
|
|
+
|
|
|
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
|
|
|
+import com.mooctest.crowd.site.service.ThemeSchedulerService;
|
|
|
+import com.mooctest.crowd.site.service.ThemeSchedulerTaskService;
|
|
|
+import com.mooctest.crowd.site.service.ThemeStatusService;
|
|
|
+import com.mooctest.crowd.site.service.ThemeStatusTaskService;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
|
|
+import org.springframework.scheduling.support.CronTrigger;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.Locale;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.concurrent.ScheduledFuture;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * @program: crowd
|
|
|
+ * @author: hanyuwei
|
|
|
+ * @create: 2020-07-13 11:30
|
|
|
+ **/
|
|
|
+@Service
|
|
|
+public class ThemeSchedulerTaskServiceImpl implements ThemeSchedulerTaskService {
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ThemeStatusTaskService themeStatusTaskService;
|
|
|
+
|
|
|
+ private ConcurrentHashMap<CrowdTestTask, ThemeScheduler> map = new ConcurrentHashMap<>();
|
|
|
+ @Override
|
|
|
+ public boolean createNewThemeScheduler(CrowdTestTask crowdTestTask) {
|
|
|
+ if(! this.map.containsKey(crowdTestTask)) {
|
|
|
+ String cronExp = this.generateNextCronExp(crowdTestTask);
|
|
|
+ if(cronExp==null){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ ThemeScheduler crowdTestTaskScheduler = new ThemeScheduler(crowdTestTask, cronExp);
|
|
|
+ crowdTestTaskScheduler.startCron();
|
|
|
+ map.put(crowdTestTask, crowdTestTaskScheduler);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String generateNextCronExp(CrowdTestTask crowdTestTask) {
|
|
|
+ String cronExp = null;
|
|
|
+ String dateFormat="ss mm HH dd MM EE";
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.US);
|
|
|
+ Date now = new Date();
|
|
|
+ if(now.before(crowdTestTask.getCreateTime())) {
|
|
|
+ cronExp = sdf.format(crowdTestTask.getCreateTime());
|
|
|
+ } else if(now.before(crowdTestTask.getDeadTime())){
|
|
|
+ cronExp = sdf.format(crowdTestTask.getDeadTime());
|
|
|
+ }
|
|
|
+ return cronExp;
|
|
|
+ }
|
|
|
+ @Override
|
|
|
+ public boolean cancelThemeScheduler(CrowdTestTask crowdTestTask) {
|
|
|
+ if(this.map.containsKey(crowdTestTask)) {
|
|
|
+ ThemeScheduler crowdTestTaskScheduler = map.get(crowdTestTask);
|
|
|
+ crowdTestTaskScheduler.stopCron();
|
|
|
+ map.remove(crowdTestTask);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ private class ThemeScheduler {
|
|
|
+ private ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
|
|
|
+ private ScheduledFuture<?> future;
|
|
|
+ private CrowdTestTask crowdTestTask = null;
|
|
|
+ private String cronExp = null;
|
|
|
+
|
|
|
+ ThemeScheduler() {}
|
|
|
+
|
|
|
+ ThemeScheduler (CrowdTestTask crowdTestTask, String cronExp) {
|
|
|
+ this.crowdTestTask = crowdTestTask;
|
|
|
+ this.cronExp = cronExp;
|
|
|
+ this.threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
|
|
|
+ this.threadPoolTaskScheduler.initialize();
|
|
|
+ }
|
|
|
+ public String startCron() {
|
|
|
+ future = this.threadPoolTaskScheduler.schedule(new MyRunnable(this.crowdTestTask), new CronTrigger(this.cronExp));
|
|
|
+ return "startCron";
|
|
|
+ }
|
|
|
+
|
|
|
+ public String stopCron() {
|
|
|
+ if (future != null) {
|
|
|
+ future.cancel(true);
|
|
|
+ }
|
|
|
+ return "stopCron";
|
|
|
+ }
|
|
|
+
|
|
|
+ private class MyRunnable implements Runnable {
|
|
|
+
|
|
|
+ private CrowdTestTask crowdTestTask;
|
|
|
+
|
|
|
+ public MyRunnable() {}
|
|
|
+
|
|
|
+ public MyRunnable (CrowdTestTask crowdTestTask) {
|
|
|
+ this.crowdTestTask = crowdTestTask;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ System.out.println("run111 ");
|
|
|
+ Integer result = themeStatusTaskService.updateStatus(this.crowdTestTask);
|
|
|
+ map.remove(crowdTestTask);
|
|
|
+ if(result.equals(CrowdTestTask.HAS_CREATED) || result.equals(CrowdTestTask.HAS_RELEASED)) {
|
|
|
+ System.out.println("run22 ");
|
|
|
+ createNewThemeScheduler(crowdTestTask);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|