取消任务

场景:第三接口网络不通,使用延迟任务进行重试,当达到阈值以后,取消任务。

taskId——》删除任务——》更新日志状态——》删除redis中的数据

1、根据taskid删除任务,修改任务日志状态为 2(取消)

2、删除redis中对应的任务数据,包括list和zset

    /**
     * 取消任务
     * @param taskId
     * @return
     */
    @Override
    public boolean cancelTask(Long taskId) {
        boolean flag = false;
        //1、删除任务,更新任务日志
        Task task = updateDb(taskId, ScheduleConstants.CANCELLED);

        //2、删除redis
        if(task != null){
            removeTaskFromCache(task);
            flag = true;
        }
        return flag;
    }

    /**
     * 删除redis中的数据
     * @param task
     */
    private void removeTaskFromCache(Task task) {
        String key = task.getTaskType() + "_" + task.getPriority();
        if(task.getExecuteTime() <= System.currentTimeMillis()){
            //从list中删除, 0表示找到多少删除多少
            cacheService.lRemove(ScheduleConstants.TOPIC+key, 0, JSON.toJSONString(task));
        }else{
            cacheService.zRemove(ScheduleConstants.FUTURE+key, JSON.toJSONString(task));
        }
    }

    /**
     * 删除任务,更新任务日志
     * @param taskId
     * @param cancelled
     * @return
     */
    private Task updateDb(Long taskId, int cancelled) {
        Task task = null;
        try {
            //删除任务
            taskinfoMapper.deleteById(taskId);
            //更新任务日志
            TaskinfoLogs taskinfoLogs = taskinfoLogsMapper.selectById(taskId);
            taskinfoLogs.setStatus(cancelled);
            taskinfoLogsMapper.updateById(taskinfoLogs);

            task = new Task();
            BeanUtils.copyProperties(taskinfoLogs, task);
            task.setExecuteTime(taskinfoLogs.getExecuteTime().getTime());
        }catch (Exception e){
            log.error("task cancel exception taskId = {}" + taskId);
        }

        return task;
    }

 

posted @ 2023-07-05 09:18  佛系粥米  阅读(42)  评论(0编辑  收藏  举报