git 5 年 前
コミット
db490ac131

+ 6 - 1
core/src/main/java/com/mooctest/crowd/domain/dao/CrowdTestTaskDao.java

@@ -5,9 +5,12 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.data.repository.query.Param;
+
 import javax.transaction.Transactional;
 import java.util.List;
 
@@ -65,5 +68,7 @@ public interface CrowdTestTaskDao extends CrudRepository<CrowdTestTaskPO, Long>,
     @Override
     <S extends CrowdTestTaskPO> S save(S s);
 
-
+    @Modifying
+    @Query(nativeQuery = true,value="update crowd_test_task set CTT_STATUS= ?1 where CTT_CODE=?2")
+    void updateStatusById(@Param("status") int status, @Param("code") String code);
 }

+ 7 - 0
core/src/main/java/com/mooctest/crowd/domain/domainobject/CrowdTestTask.java

@@ -16,6 +16,13 @@ import java.util.stream.Collectors;
  */
 @Data
 public class CrowdTestTask {
+    public static final int HAS_REJECTED = -1;  //定向发布被拒
+    public static final int HAS_CREATED = 0;    //创建任务
+    public static final int HAS_RELEASED = 1;   //发布任务
+    public static final int HAS_RECEIVED = 2;   //接受任务
+    public static final int HAS_COMMITED = 3;   //区域管理员提交任务
+    public static final int HAS_FINISHED = 4;   //结束任务
+    public static final int HAS_TIME_OUT = 5; //时间截止
     private Long id;
     private String name;
     private String code;

+ 8 - 0
site/src/main/java/com/mooctest/crowd/site/service/ThemeSchedulerTaskService.java

@@ -0,0 +1,8 @@
+package com.mooctest.crowd.site.service;
+
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+
+public interface ThemeSchedulerTaskService {
+    boolean createNewThemeScheduler(CrowdTestTask crowdTestProject);
+    boolean cancelThemeScheduler(CrowdTestTask crowdTestProject);
+}

+ 7 - 0
site/src/main/java/com/mooctest/crowd/site/service/ThemeStatusTaskService.java

@@ -0,0 +1,7 @@
+package com.mooctest.crowd.site.service;
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+
+
+public interface ThemeStatusTaskService {
+    Integer updateStatus(CrowdTestTask crowdTestProject);
+}

+ 5 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdTaskServiceImpl.java

@@ -18,6 +18,7 @@ import com.mooctest.crowd.site.data.vo.CrowdTaskVO;
 import com.mooctest.crowd.site.data.vo.CrowdTestProjectVO;
 import com.mooctest.crowd.site.mediator.ViewMediator;
 import com.mooctest.crowd.site.service.CrowdTaskService;
+import com.mooctest.crowd.site.service.ThemeSchedulerTaskService;
 import com.mooctest.crowd.site.util.GenerateFlowCodeUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,6 +58,9 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
     @Autowired
     private EvaluationAgencyDao agencyDao;
 
+    @Autowired
+    private ThemeSchedulerTaskService themeSchedulerTaskService;
+
     @Override
     public List<CrowdTaskVO> findMoreHotTasks(){
         List<CrowdTaskVO> list=viewMediator.findMoreHotTasks();//根据创建时间已经倒叙排序好
@@ -91,6 +95,7 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
         CrowdTestProject project = projectRepo.getByProjectCode(projectCode);
         String taskCode = GenerateFlowCodeUtil.generateFlowCode("TASK-"+ ProjectType.getCode(command.getType()));
         task.create(taskCode);
+        themeSchedulerTaskService.createNewThemeScheduler(task);
         project.addTask(task);
         projectRepo.saveCrowdTestProject(project);
         return getTaskDetails(projectCode, taskCode, userId);

+ 119 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/ThemeSchedulerTaskServiceImpl.java

@@ -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);
+                }
+            }
+        }
+    }
+}

+ 30 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/ThemeStatusTaskServiceImpl.java

@@ -0,0 +1,30 @@
+package com.mooctest.crowd.site.service.impl;
+
+import com.mooctest.crowd.domain.dao.CrowdTestTaskDao;
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+import com.mooctest.crowd.site.service.ThemeStatusTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @program: crowd
+ * @author: hanyuwei
+ * @create: 2020-07-13 13:11
+ **/
+@Service
+public class ThemeStatusTaskServiceImpl implements ThemeStatusTaskService {
+
+    @Autowired
+    private CrowdTestTaskDao crowdTestProjectDao;
+
+    @Override
+    public Integer updateStatus(CrowdTestTask crowdTestProject) {
+        int status = 0;
+        long curr = System.currentTimeMillis();
+        if (crowdTestProject.getDeadTime().getTime() < curr) {
+            status = CrowdTestTask.HAS_TIME_OUT;
+        }
+        crowdTestProjectDao.updateStatusById(status,crowdTestProject.getCode());
+        return status;
+    }
+}