Browse Source

初始化任务到内存, 派发任务, 接受客户端相应(acceptTask)

jxing 6 years ago
parent
commit
fb177c67b2

+ 6 - 0
scheduler/build.gradle

@@ -73,5 +73,11 @@ dependencies {
     testCompile group: 'junit', name: 'junit', version: '4.12'
     // https://mvnrepository.com/artifact/mysql/mysql-connector-java
     compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.15'
+    // https://mvnrepository.com/artifact/org.slf4j/slf4j-api
+    //compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.26'
+// https://mvnrepository.com/artifact/log4j/log4j
+    compile group: 'log4j', name: 'log4j', version: '1.2.17'
+// https://mvnrepository.com/artifact/com.alibaba/fastjson
+    compile group: 'com.alibaba', name: 'fastjson', version: '1.2.56'
 
 }

+ 9 - 0
scheduler/src/main/java/cn/sagacloud/mybatis/model/TaskModel.java

@@ -12,10 +12,19 @@ public class TaskModel {
     private int task_status;
     private String task_result_json;
     private String task_last_client;
+    private long task_sent_time;
     private long task_expected_finish_time;
 
     private List<DownloadTaskModel> downloadTaskModelList;
 
+    public long getTask_sent_time() {
+        return task_sent_time;
+    }
+
+    public void setTask_sent_time(long task_sent_time) {
+        this.task_sent_time = task_sent_time;
+    }
+
     public int getId() {
         return id;
     }

+ 57 - 4
scheduler/src/main/java/cn/sagacloud/pojo/ChannelHandlerContextWrapper.java

@@ -1,11 +1,26 @@
 package cn.sagacloud.pojo;
 
+import cn.sagacloud.mybatis.model.TaskModel;
+import cn.sagacloud.proto.MessageProto;
+import cn.sagacloud.proto.MessageUtil;
+import cn.sagacloud.server.DispatchTask;
+import cn.sagacloud.utils.CommonUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import io.netty.channel.ChannelHandlerContext;
 
+import java.util.HashMap;
+import java.util.Map;
+
 public class ChannelHandlerContextWrapper {
     private ChannelHandlerContext ctx;  // 通信handler
     private long lastRejectTime;        // unix时间片, 精确到秒
+    private final long sendingTimeOut = 10;            // 发送给客户端任务, 如果超过该时间未响应, 则超时, 并将发送的任务状态置为初始状态
+    private final long lastRefuseTimeOut = 3600;       // 如果客户端拒绝任务, 则等待lastRefuseTimeOut秒, 才会再分配任务给该客户端
+    private long lastRefuseTime = 0L;
     private String macAddr;             // mac地址
+    // 任务发送中状态map,     key --> taskid, value --> 发送任务时间点,    如果超过15s, 即为超时.
+    private Map<Integer, Long> taskSendingStatusMap = new HashMap<>();
 
     public ChannelHandlerContextWrapper(ChannelHandlerContext ctx) {
         this.ctx = ctx;
@@ -13,6 +28,31 @@ public class ChannelHandlerContextWrapper {
         macAddr = null;
     }
 
+    public void sendTask(TaskModel toBeSent) {
+        if(ctx.channel().isActive()){
+            MessageProto.Message msg = MessageUtil.buildMessage(Command.SendTask.name(), toBeSent.getId(), JSON.toJSONString(toBeSent));
+            ctx.writeAndFlush(msg);
+            taskSendingStatusMap.put(toBeSent.getId(), CommonUtil.getTime());
+        }
+    }
+
+    /**
+     * 获取一个在发送任务时超时的任务id
+     * @return 任务id
+     */
+    public int getOneSendingTimeOutTaskId(){
+        if(taskSendingStatusMap.size() == 0)
+            return -1;
+        long currentTime = CommonUtil.getTime();
+        for(Integer id : taskSendingStatusMap.keySet()){
+            Long sentTime = taskSendingStatusMap.get(id);
+            if(currentTime - sentTime > sendingTimeOut){
+                return id;
+            }
+        }
+        return -1;
+    }
+
     public String getMacAddr() {
         return macAddr;
     }
@@ -25,10 +65,6 @@ public class ChannelHandlerContextWrapper {
         return ctx;
     }
 
-//    public void setCtx(ChannelHandlerContext chx) {
-//        this.ctx = chx;
-//    }
-
     public long getLastRejectTime() {
         return lastRejectTime;
     }
@@ -36,4 +72,21 @@ public class ChannelHandlerContextWrapper {
     public void setLastRejectTime(long lastRejectTime) {
         this.lastRejectTime = lastRejectTime;
     }
+
+
+    public boolean isLastRefuseTimeOutPassed() {
+        if(lastRefuseTime == 0)
+            return true;
+        long currentTime = CommonUtil.getTime();
+        if(currentTime - lastRefuseTimeOut > lastRefuseTime)
+            return true;
+        return false;
+    }
+    // 是否加锁
+    public void acceptTask(int taskId) {
+        TaskStatus isAllow = DispatchTask.isAllowCmd(taskId, Command.AcceptTask);
+        if(isAllow==null)
+            return;
+        DispatchTask.changeStatusByCmd(taskId, Command.AcceptTask);
+    }
 }

+ 5 - 13
scheduler/src/main/java/cn/sagacloud/pojo/Command.java

@@ -21,18 +21,10 @@ public enum Command {
         cmdList = new ArrayList<>();
         cmdList.addAll(Arrays.asList(Command.values()));
     }
-    public static Command getCmdById(int index) {
-        if(index > -1 && index < cmdList.size()){
-            return cmdList.get(index);
-        }
-        return null;
-    }
-
-    public static int getIdByCmd(Command cmd) {
-        for(int i = 0; i < cmdList.size(); ++i){
-            if(cmdList.get(i).equals(cmd))
-                return i;
-        }
-        return -1;
+    // 是否是和任务状态转换相关的命令
+    public static boolean isStatusRelated(Command cmd){
+        if(ClientInfo.equals(cmd))
+            return false;
+        return true;
     }
 }

+ 26 - 1
scheduler/src/main/java/cn/sagacloud/pojo/TaskStatus.java

@@ -4,6 +4,31 @@ package cn.sagacloud.pojo;
  * Create Time: 2019/3/11
  */
 
+import java.util.ArrayList;
+import java.util.Arrays;
+
 public enum TaskStatus {
-    Waiting, Sending, Sent, FileDownloadException, CommandExecuteException, Finished
+    // 顺序不可打乱, 添加要在后面添加
+    Waiting, Sending, Sent, FileDownloadException, CommandExecuteException, Finished;
+    private static ArrayList<TaskStatus> statusList;
+    static{
+        statusList = new ArrayList<>();
+        statusList.addAll(Arrays.asList(TaskStatus.values()));
+    }
+    public static TaskStatus getTaskStatusById(int index) {
+        if(index > -1 && index < statusList.size()){
+            return statusList.get(index);
+        }
+        return null;
+    }
+
+    public static int getIdByTaskStatus(TaskStatus status) {
+        if(status == null)
+            return -1;
+        for(int i = 0; i < statusList.size(); ++i){
+            if(statusList.get(i).equals(status))
+                return i;
+        }
+        return -1;
+    }
 }

+ 159 - 1
scheduler/src/main/java/cn/sagacloud/server/DispatchTask.java

@@ -1,12 +1,170 @@
 package cn.sagacloud.server;
 
 import cn.sagacloud.guice.InjectorInit;
+import cn.sagacloud.mybatis.model.TaskModel;
 import cn.sagacloud.mybatis.service.TaskService;
+import cn.sagacloud.pojo.ChannelHandlerContextWrapper;
+import cn.sagacloud.pojo.Command;
+import cn.sagacloud.pojo.TaskStatus;
+import cn.sagacloud.utils.CommonUtil;
+import org.apache.log4j.Logger;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
 
 public class DispatchTask implements Runnable {
-    TaskService service = InjectorInit.getInjector().getInstance(TaskService.class);
+    private static Logger log = Logger.getLogger(DispatchTask.class);
+    private static TaskService service = InjectorInit.getInjector().getInstance(TaskService.class);
+    ArrayList<ChannelHandlerContextWrapper> clientList;
+    private int clientIndex = 0;
+    public static Map<Integer, TaskModel> tasks;
+    public DispatchTask(ArrayList<ChannelHandlerContextWrapper> clientList) throws Exception {
+        this.clientList = clientList;
+        tasks = service.getAllTaskMapByStatus(Arrays.asList(0, 1, 2));
+    }
+
+    /**
+     * 是否当前状态下可以执行该命令
+     * @param taskId task id
+     * @param cmd command
+     * @return 写一个状态, 如果不可执行该命令, 返回null
+     */
+    public static TaskStatus isAllowCmd(int taskId, Command cmd) {
+        TaskModel task = DispatchTask.tasks.get(taskId);
+        if(task == null)
+            return null;
+        TaskStatus status = TaskStatus.getTaskStatusById(task.getTask_status());
+        if(status == null)
+            return null;
+        Map<Command, TaskStatus> allowCmd = SchedulerHandler.statusTransitionMap.get(status);
+        if(allowCmd == null)
+            return null;
+        return allowCmd.get(cmd);
+    }
+
+    public static void changeStatusByCmd(int taskId, Command cmd) {
+        TaskStatus nextStatus = isAllowCmd(taskId, cmd);
+        if(nextStatus == null)
+            return;
+        TaskModel task = DispatchTask.tasks.get(taskId);
+        if(task == null)
+            return;
+        task.setTask_status(TaskStatus.getIdByTaskStatus(nextStatus));
+        updateTask(task);
+    }
+
     @Override
     public void run() {
+        // 考虑加锁
+        for(long cnt = Long.MAX_VALUE; cnt > Long.MIN_VALUE; --cnt) {
+            // 获取到一个在waiting状态的任务
+            TaskModel toBeSent = getOneAvailableTask();
+            if(toBeSent != null) {
+                // 获取到一个潜在可以接受任务的客户端
+                ChannelHandlerContextWrapper client = getOneAvailableClient();
+                if(client != null) {
+                    // 将获取到的任务发送给选中客户端
+                    client.sendTask(toBeSent);
+                    // 检测sending, sent状态的任务, 是否有超时需要重新下载的任务
+                    checkSendingTimeOut();
+                    checkExecuteTimeOut();
+                }
+            }
+            try {
+                Thread.sleep(1000);
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    private void checkExecuteTimeOut() {
+        for(ChannelHandlerContextWrapper client : clientList){
+            int id = getOneExecuteTimeOutTaskId();
+            if(id > 0){
+                // 是否加锁
+                tasks.get(id).setTask_status(0);
+            }
+        }
+    }
+    /**
+     * 获取一个在执行任务时超时的任务id
+     * @return
+     */
+    private int getOneExecuteTimeOutTaskId() {
+        if(tasks == null || tasks.size() == 0)
+            return -1;
+        long currentTime = CommonUtil.getTime();
+        for(Integer id : tasks.keySet()){
+            TaskModel task = tasks.get(id);
+            long expectTime = task.getTask_expected_finish_time();
+            long sendTime = task.getTask_sent_time();
+            if(sendTime <= 0)
+                continue;
+            if(currentTime  - sendTime > expectTime){
+                return id;
+            }
+        }
+        return -1;
+    }
+
+    private void checkSendingTimeOut() {
+        for(ChannelHandlerContextWrapper client : clientList){
+            int id = client.getOneSendingTimeOutTaskId();
+            if(id > 0){
+                // 是否加锁
+                tasks.get(id).setTask_status(0);
+            }
+        }
+    }
+
+    private ChannelHandlerContextWrapper getOneAvailableClient() {
+        int clientCount ;
+        if(clientList == null || clientList.size() == 0)
+            return null;
+        else {
+            clientCount = clientList.size();
+            if(clientCount == 0)
+                return null;
+            clientIndex %= clientCount;
+        }
+        ChannelHandlerContextWrapper wrapper = null;
+        do{
+            try {
+                wrapper = clientList.get(clientIndex);
+            }catch (Exception ex){
+                wrapper = null;
+                clientCount = clientList.size();
+            }
+            if(!wrapper.isLastRefuseTimeOutPassed()){
+                wrapper = null;
+            }
+            if(clientCount == 0)
+                return null;
+            clientIndex = (clientIndex + 1) % clientCount;
+        }while(wrapper == null && clientIndex != 0);
+        return wrapper;
+    }
+
+    private TaskModel getOneAvailableTask() {
+        //检测到在waiting状态的任务, 返回
+        for(Integer taskId : tasks.keySet()){
+            TaskModel task = tasks.get(taskId);
+            if(task.getTask_status() == 0){
+                return task;
+            }
+        }
+        return null;
+    }
 
+    private static void updateTask(TaskModel task){
+        try {
+            service.updateTask(task);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("任务:" + task.getId() + "update失败");
+        }
     }
 }

+ 35 - 0
scheduler/src/main/java/cn/sagacloud/server/MessageHandler.java

@@ -0,0 +1,35 @@
+package cn.sagacloud.server;
+
+import cn.sagacloud.pojo.ChannelHandlerContextWrapper;
+import cn.sagacloud.pojo.Command;
+import cn.sagacloud.proto.MessageProto;
+import cn.sagacloud.utils.CommonUtil;
+import io.netty.channel.ChannelHandlerContext;
+import org.checkerframework.checker.formatter.FormatUtil;
+
+public class MessageHandler {
+    public static void handle(MessageProto.Message message, ChannelHandlerContextWrapper ctx) {
+        Command cmd;
+        try {
+            cmd = Command.valueOf(message.getCmd());
+        }catch (Exception ex){
+            return;
+        }
+        switch (cmd){
+            case AcceptTask:
+                ctx.acceptTask(message.getTaskId());
+                break;
+            case RefuseTask:
+                ctx.setLastRejectTime(CommonUtil.getTime());
+                break;
+            case ClientInfo:
+                break;
+            case TaskSuccess:
+                break;
+            case CommandError:
+                break;
+            case DownloadError:
+                break;
+        }
+    }
+}

+ 34 - 13
scheduler/src/main/java/cn/sagacloud/server/SchedulerHandler.java

@@ -15,23 +15,46 @@ import io.netty.channel.ChannelInboundHandlerAdapter;
 
 import java.net.SocketAddress;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 public class SchedulerHandler extends ChannelInboundHandlerAdapter {
     ArrayList<ChannelHandlerContextWrapper> clientList;
     private ChannelHandlerContextWrapper ctxw;
-    public static Map<TaskStatus, Set<Command>> allowedStatusCommand = new ConcurrentHashMap<>();
+    // Map<当前状态, Map<可接受的命令, 接受完命令后的状态>>
+    public static Map<TaskStatus, Map<Command, TaskStatus>> statusTransitionMap = new ConcurrentHashMap<>();
     static {
-        allowedStatusCommand.put(TaskStatus.Waiting, CommonUtil.createSet(Command.TaskSuccess));
-        allowedStatusCommand.put(TaskStatus.Sending, CommonUtil.createSet(Command.AcceptTask, Command.RefuseTask, Command.TaskSuccess));
-        allowedStatusCommand.put(TaskStatus.Sent, CommonUtil.createSet(Command.CommandError, Command.DownloadError, Command.TaskSuccess));
-        allowedStatusCommand.put(TaskStatus.FileDownloadException, CommonUtil.createSet(Command.TaskSuccess));
-        allowedStatusCommand.put(TaskStatus.CommandExecuteException, CommonUtil.createSet(Command.TaskSuccess));
-        allowedStatusCommand.put(TaskStatus.Finished, CommonUtil.createSet());
-    }
+        Map<Command, TaskStatus> waitingMap = new HashMap<>();
+        Map<Command, TaskStatus> sendingMap = new HashMap<>();
+        Map<Command, TaskStatus> sentMap = new HashMap<>();
+        Map<Command, TaskStatus> fileDownloadExceptionMap = new HashMap<>();
+        Map<Command, TaskStatus> commandExceptionMap = new HashMap<>();
+        statusTransitionMap.put(TaskStatus.Waiting, waitingMap);//CommonUtil.createSet(Command.TaskSuccess));
+        statusTransitionMap.put(TaskStatus.Sending, sendingMap);//CommonUtil.createSet(Command.AcceptTask, Command.RefuseTask, Command.TaskSuccess));
+        statusTransitionMap.put(TaskStatus.Sent, sentMap);//CommonUtil.createSet(Command.CommandError, Command.DownloadError, Command.TaskSuccess));
+        statusTransitionMap.put(TaskStatus.FileDownloadException, fileDownloadExceptionMap);//CommonUtil.createSet(Command.TaskSuccess));
+        statusTransitionMap.put(TaskStatus.CommandExecuteException, commandExceptionMap);//CommonUtil.createSet(Command.TaskSuccess));
+        statusTransitionMap.put(TaskStatus.Finished, new HashMap<>());
+
+        waitingMap.put(Command.TaskSuccess, TaskStatus.Finished);
+        waitingMap.put(Command.DownloadError, TaskStatus.FileDownloadException);
+        waitingMap.put(Command.CommandError, TaskStatus.CommandExecuteException);
+        waitingMap.put(Command.AcceptTask, TaskStatus.Sent);
+
+        sendingMap.put(Command.AcceptTask, TaskStatus.Sent);
+        sendingMap.put(Command.RefuseTask, TaskStatus.Waiting);
+        sendingMap.put(Command.TaskSuccess, TaskStatus.Finished);
+        sendingMap.put(Command.DownloadError, TaskStatus.FileDownloadException);
+        sendingMap.put(Command.CommandError, TaskStatus.CommandExecuteException);
 
+        sentMap.put(Command.TaskSuccess, TaskStatus.Finished);
+        sentMap.put(Command.DownloadError, TaskStatus.FileDownloadException);
+        sentMap.put(Command.CommandError, TaskStatus.CommandExecuteException);
+
+        fileDownloadExceptionMap.put(Command.TaskSuccess, TaskStatus.Finished);
+        commandExceptionMap.put(Command.TaskSuccess, TaskStatus.Finished);
+    }
     public SchedulerHandler(ArrayList<ChannelHandlerContextWrapper> clientList) {
         this.clientList = clientList;
     }
@@ -69,11 +92,9 @@ public class SchedulerHandler extends ChannelInboundHandlerAdapter {
             // Do something with msg
             MessageProto.Message message = (MessageProto.Message)msg;
             MessageUtil.printMessage(message);
-            MessageProto.Message myMsg = MessageUtil.buildMessage(message.getCmd() + 1,
-                    message.getTaskId(),
-                    message.getContent() + " from server");
 
-            ctx.writeAndFlush(myMsg);  // 异步
+            MessageHandler.handle(message, ctxw);
+            //ctx.writeAndFlush(myMsg);  // 异步
         } finally {
             // 如果ctx write 或 writeAndFlush过的话, 就不用释放msg
             //ReferenceCountUtil.release(msg);

+ 12 - 4
scheduler/src/main/java/cn/sagacloud/server/Server.java

@@ -19,6 +19,7 @@ import io.netty.handler.codec.protobuf.ProtobufDecoder;
 import io.netty.handler.codec.protobuf.ProtobufEncoder;
 import io.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
 import io.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender;
+import org.apache.log4j.Logger;
 import org.yaml.snakeyaml.Yaml;
 
 import java.util.ArrayList;
@@ -32,8 +33,10 @@ public class Server {
     private Channel channel = null;
     public static ExecutorService pool = Executors.newFixedThreadPool(8);
     Config config;
+    DispatchTask dispatchTask;
     ArrayList<ChannelHandlerContextWrapper> clientList = new ArrayList<>();
-    public Server(){
+    private static Logger log = Logger.getLogger(Server.class);
+    public Server() throws Exception {
         // 初始化serverSocket
         bootstrap.group(acceptGroup, workerGroup)
                 .channel(NioServerSocketChannel.class)
@@ -55,18 +58,23 @@ public class Server {
         .option(ChannelOption.SO_BACKLOG, 128)
         .childOption(ChannelOption.SO_KEEPALIVE, true);
         // 初始化配置
+        log.info("开始读取配置文件...");
         config = new Yaml().loadAs(Server.class.getClassLoader().getResourceAsStream("config.yml"), Config.class);
+        log.info("读取配置文件完毕...");
         // 初始化Task(从sql到内存)
-        DispatchTask dispatchTask = new DispatchTask();
-
+        log.info("开始同步数据库中任务...");
+        dispatchTask = new DispatchTask(clientList);
     }
 
     public void start() throws InterruptedException {
         try {
             // 启动服务
+            log.info("开始启动监听...");
             channel = bootstrap.bind(config.getPort()).sync().channel();
-
+            log.info("开始分发任务...");
+            pool.submit(dispatchTask);
             //pool.submit()
+            log.info("服务器启动完毕");
             channel.closeFuture().sync();
         } finally {
             workerGroup.shutdownGracefully();

+ 7 - 0
scheduler/src/main/java/cn/sagacloud/utils/CommonUtil.java

@@ -9,6 +9,8 @@ import cn.sagacloud.pojo.Command;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -29,4 +31,9 @@ public class CommonUtil {
         ByteBuffer bb = cs.encode(cb);
         return bb.array();
     }
+    public static long getTime() {
+        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        return Long.parseLong(LocalDateTime.now().format(format));
+    }
+
 }

+ 7 - 6
scheduler/src/main/resources/mapper/TaskMap.xml

@@ -2,8 +2,8 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="cn.sagacloud.mybatis.mapper.TaskMapper">
     <insert id="addTask" parameterType="cn.sagacloud.mybatis.model.TaskModel" useGeneratedKeys="true" keyProperty="id">
-        INSERT INTO `task`(task_name, task_cmd, task_param, task_status, task_result_json, task_last_client, task_expected_finish_time)
-        VALUE(#{task_name},#{task_cmd},#{task_param},#{task_status},#{task_result_json},#{task_last_client},#{task_expected_finish_time});
+        INSERT INTO `task`(task_name, task_cmd, task_param, task_status, task_result_json, task_sent_time, task_last_client, task_expected_finish_time)
+        VALUE(#{task_name},#{task_cmd},#{task_param},#{task_status},#{task_result_json}, #{task_sent_time}, #{task_last_client},#{task_expected_finish_time});
     </insert>
 
     <insert id="addDownload" parameterType="cn.sagacloud.mybatis.model.DownloadTaskModel" useGeneratedKeys="true" keyProperty="list.id">
@@ -14,7 +14,7 @@
     </insert>
 
     <select id="getTasksByIds" resultMap="taskModelList">
-        select task.id, task_name, task_cmd, task_param, task_status, task_result_json, task_last_client,
+        select task.id, task_name, task_cmd, task_param, task_status, task_result_json, task_sent_time, task_last_client,
         task_expected_finish_time, download.id downloadId, task_id, task_url, task_md5
         from `task` right join `download` on task.id = download.task_id where task.id in
         <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
@@ -23,7 +23,7 @@
     </select>
 
     <select id="getTasksByStatus" resultMap="taskModelList">
-        select task.id, task_name, task_cmd, task_param, task_status, task_result_json, task_last_client,
+        select task.id, task_name, task_cmd, task_param, task_status, task_result_json, task_sent_time, task_last_client,
         task_expected_finish_time, download.id downloadId, task_id, task_url, task_md5
         from `task` right join `download` on task.id = download.task_id where task.task_status in
         <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
@@ -32,7 +32,7 @@
     </select>
 
     <select id="getTasksMapByIds" resultMap="taskModelList">
-        select task.id, task_name, task_cmd, task_param, task_status, task_result_json, task_last_client,
+        select task.id, task_name, task_cmd, task_param, task_status, task_result_json, task_sent_time, task_last_client,
         task_expected_finish_time, download.id downloadId, task_id, task_url, task_md5
         from `task` right join `download` on task.id = download.task_id where task.id in
         <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
@@ -41,7 +41,7 @@
     </select>
 
     <select id="getTasksMapByStatus" resultMap="taskModelList">
-        select task.id, task_name, task_cmd, task_param, task_status, task_result_json, task_last_client,
+        select task.id, task_name, task_cmd, task_param, task_status, task_result_json, task_sent_time, task_last_client,
         task_expected_finish_time, download.id downloadId, task_id, task_url, task_md5
         from `task` right join `download` on task.id = download.task_id where task.task_status in
         <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
@@ -72,6 +72,7 @@
             <if test="task_status!=null">task_status=#{task_status},</if>
             <if test="task_result_json!=null">task_result_json=#{task_result_json},</if>
             <if test="task_last_client!=null">task_last_client=#{task_last_client},</if>
+            <if test="task_sent_time!=null">task_sent_time=#{task_sent_time},</if>
         </trim>
         WHERE id = #{id};
     </update>

+ 2 - 6
scheduler/src/main/resources/mybatis-config.xml

@@ -20,7 +20,8 @@
             <transactionManager type="JDBC">
             </transactionManager>
             <dataSource type="POOLED">
-                <property name="driver" value="com.mysql.jdbc.Driver"/>
+                <!--<property name="driver" value="com.mysql.jdbc.Driver"/>-->
+                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                 <!--<property name="url" value="jdbc:mysql://101.201.234.108:3306/venders?serverTimezone=UTC"/>-->
                 <!--<property name="url" value="jdbc:mysql://172.16.3.12:3306/venders?serverTimezone=UTC"/>-->
                 <property name="url" value="jdbc:mysql://127.0.0.1:3306/scheduler?serverTimezone=UTC"/>
@@ -33,11 +34,6 @@
 
     <mappers>
         <mapper resource="mapper/TaskMap.xml"/>
-        <!--<mapper resource="mapper/BrandMap.xml"/>-->
-        <!--<mapper resource="mapper/ProductMap.xml"/>-->
-        <!--<mapper resource="mapper/SpecificationMap.xml"/>-->
-        <!--<mapper resource="mapper/ContractMap.xml"/>-->
-        <!--<mapper resource="mapper/AuxiliaryMap.xml"/>-->
     </mappers>