|
@@ -0,0 +1,207 @@
|
|
|
+package com.idiot.operationbackend.handler;
|
|
|
+
|
|
|
+import com.idiot.operationbackend.entity.JobTask;
|
|
|
+import com.idiot.operationbackend.service.facade.JobTaskService;
|
|
|
+import com.idiot.operationbackend.support.job.BaseScheduledTask;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.InitializingBean;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
|
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.concurrent.ScheduledFuture;
|
|
|
+import java.util.concurrent.locks.ReentrantLock;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author wang xiao
|
|
|
+ * @date Created in 15:24 2020/9/23
|
|
|
+ */
|
|
|
+@Component
|
|
|
+public class JobScheduleHandler implements InitializingBean {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加进来的job 未注册
|
|
|
+ */
|
|
|
+ private final Map<String, JobTask> taskMap = new ConcurrentHashMap<>(16);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 注册进来的 ScheduledFuture
|
|
|
+ */
|
|
|
+ private final Map<String, ScheduledFuture<?>> futureMap = new ConcurrentHashMap<>(16);
|
|
|
+
|
|
|
+ private final Logger logger = LoggerFactory.getLogger(JobScheduleHandler.class);
|
|
|
+
|
|
|
+ private final ReentrantLock lock = new ReentrantLock();
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ @Qualifier(value = "taskScheduler")
|
|
|
+ private ThreadPoolTaskScheduler taskScheduler;
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private JobTaskService jobTaskService;
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加任务
|
|
|
+ * @author wangxiao
|
|
|
+ * @date 16:05 2020/9/23
|
|
|
+ * @param jobTask 任务
|
|
|
+ * @return java.lang.Boolean
|
|
|
+ */
|
|
|
+ public Boolean addJob(JobTask jobTask) {
|
|
|
+ String taskKey = jobTask.getTaskKey();
|
|
|
+ logger.info("任务:[任务id:{},公众号:{},描述:{}],添加任务------>start",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
|
|
|
+ lock.lock();
|
|
|
+ try{
|
|
|
+ if (isAdd(taskKey)) {
|
|
|
+ logger.info("任务:[任务id:{},公众号:{},描述:{}],添加任务------>已经存在",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ this.taskMap.put(taskKey,jobTask);
|
|
|
+ logger.info("任务:[任务id:{},公众号:{},描述:{}],添加任务------>end",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
|
|
|
+ }finally {
|
|
|
+ lock.unlock();
|
|
|
+ logger.info("任务:[任务id:{},公众号:{},描述:{}],添加任务------>lock error",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 执行注册任务
|
|
|
+ * @author wangxiao
|
|
|
+ * @date 16:00 2020/9/23
|
|
|
+ * @param taskKey taskKey
|
|
|
+ */
|
|
|
+ private void registerTask(String taskKey) {
|
|
|
+ JobTask jobTask = taskMap.get(taskKey);
|
|
|
+ if (Objects.isNull(jobTask)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (isRegister(taskKey)){
|
|
|
+ logger.info("任务:[任务id:{},公众号:{},描述:{}]注册------->已经注册",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
|
|
|
+ }
|
|
|
+ logger.info("任务:[任务id:{},公众号:{},描述:{}]注册------->start",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
|
|
|
+ Long taskTime = jobTask.getTaskTimer();
|
|
|
+ BaseScheduledTask scheduledTask = getTaskByKey(taskKey);
|
|
|
+ if (Objects.isNull(scheduledTask)){
|
|
|
+ logger.info("任务:[任务id:{},公众号:{},描述:{}]注册------->is null",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ ScheduledFuture<?> scheduledFuture = taskScheduler.schedule(scheduledTask,new Date(taskTime));
|
|
|
+ futureMap.put(taskKey, scheduledFuture);
|
|
|
+ logger.info("任务:[任务id:{},公众号:{},描述:{}]注册------->end",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加并注册
|
|
|
+ * @author wangxiao
|
|
|
+ * @date 16:35 2020/9/23
|
|
|
+ * @param jobTask jobTask
|
|
|
+ */
|
|
|
+ public void addAndRegisterJob(JobTask jobTask) {
|
|
|
+ String taskKey = jobTask.getTaskKey();
|
|
|
+ addJob(jobTask);
|
|
|
+ registerTask(taskKey);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 取消任务
|
|
|
+ * @author wangxiao
|
|
|
+ * @date 16:02 2020/9/23
|
|
|
+ * @param taskKey taskKey
|
|
|
+ * @return java.lang.Boolean
|
|
|
+ */
|
|
|
+ public Boolean cancelJob(String taskKey) {
|
|
|
+ logger.info("任务:[任务taskKey:{}]取消任务------->start",taskKey);
|
|
|
+ boolean taskStartFlag = futureMap.containsKey(taskKey);
|
|
|
+ logger.info("任务:[任务taskKey:{}是否存在:{}]取消任务------->start",taskKey,taskStartFlag);
|
|
|
+ if (taskStartFlag) {
|
|
|
+ ScheduledFuture<?> scheduledFuture = futureMap.get(taskKey);
|
|
|
+ scheduledFuture.cancel(true);
|
|
|
+ futureMap.remove(taskKey);
|
|
|
+ }
|
|
|
+ taskMap.remove(taskKey);
|
|
|
+ logger.info("任务:[任务taskKey:{}]取消任务------->end",taskKey);
|
|
|
+ return taskStartFlag;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重新添加
|
|
|
+ * @author wangxiao
|
|
|
+ * @date 16:25 2020/9/23
|
|
|
+ * @param taskKey taskKey
|
|
|
+ * @return java.lang.Boolean
|
|
|
+ */
|
|
|
+ public Boolean restart(String taskKey) {
|
|
|
+ JobTask jobTask = taskMap.get(taskKey);
|
|
|
+ logger.info("任务:[任务id:{},公众号:{},描述:{}]重启",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
|
|
|
+ this.cancelJob(taskKey);
|
|
|
+ return this.addJob(jobTask);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否已经注册成功
|
|
|
+ * @author wangxiao
|
|
|
+ * @date 15:59 2020/9/23
|
|
|
+ * @param taskKey taskKey
|
|
|
+ * @return java.lang.Boolean
|
|
|
+ */
|
|
|
+ private Boolean isRegister(String taskKey) {
|
|
|
+ if (futureMap.containsKey(taskKey)) {
|
|
|
+ if (!futureMap.get(taskKey).isCancelled()) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否已经添加成功
|
|
|
+ * @author wangxiao
|
|
|
+ * @date 15:59 2020/9/23
|
|
|
+ * @param taskKey taskKey
|
|
|
+ * @return java.lang.Boolean
|
|
|
+ */
|
|
|
+ private Boolean isAdd(String taskKey) {
|
|
|
+ return taskMap.containsKey(taskKey);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @author wangxiao
|
|
|
+ * @date 16:29 2020/9/23
|
|
|
+ * @param taskKey
|
|
|
+ * @return com.idiot.operationbackend.support.job.BaseScheduledTask
|
|
|
+ */
|
|
|
+ private BaseScheduledTask getTaskByKey (String taskKey) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void afterPropertiesSet() throws Exception {
|
|
|
+ List<JobTask> jobTaskList = jobTaskService.queryByInitJob();
|
|
|
+ if (CollectionUtils.isEmpty(jobTaskList)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ int size = jobTaskList.size();;
|
|
|
+ logger.error("!!!!初始化启动加载job!!!!--------->start,job size is:{}",size);
|
|
|
+ for (JobTask jobTask : jobTaskList) {
|
|
|
+ addAndRegisterJob(jobTask);
|
|
|
+ }
|
|
|
+ logger.error("!!!!初始化启动加载job!!!!--------->end, job size is:{}",size);
|
|
|
+ }
|
|
|
+}
|