自定义动态定时任务

@Component
@Slf4j
public class DynamicSchedulingTask implements SchedulingConfigurer {

    private Map<String, ScheduledFuture<?>> futuresMap;

    private ThreadPoolTaskScheduler threadPoolTaskScheduler;


    private int poolSize = 16;


    /**
     * 初始化任务列表
     */
    @PostConstruct
    public void init() {
        futuresMap = new ConcurrentHashMap<>(8);
        threadPoolTaskScheduler();
    }

    /**
     * 创建ThreadPoolTaskScheduler线程池
     */
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        this.threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(poolSize);
        return threadPoolTaskScheduler;
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        threadPoolTaskScheduler.initialize();
    }


    /**
     * 添加任务
     *
     * @param jobName  任务运行的唯一主键
     * @param cronExp  cron表达式
     * @param taskType 
     */
    public boolean addTask(String jobName, String cronExp, int taskType) {

        ScheduledFuture<?> scheduledFuture = futuresMap.get(jobName);
        if (null == scheduledFuture) {
            ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(new Runnable() {
                @Override
                public void run() {
                    log.info("execute time:{}", LocalDateTime.now());
                    //TODO 执行任务
                }
            }, new CronTrigger(cronExp));
            ScheduledFuture oldScheduledFuture = futuresMap.put(jobName, future);
            log.info("任务池任务数:{}", futuresMap.size());
            if (oldScheduledFuture == null) {
                return true;
            }
            else {
                log.info("添加任务key: " + jobName + "重复");
                return false;
            }

        }
        return false;
    }
    
    
      public boolean removeTask(String taskId, String key) {
        //需要优雅的停止,运行中需要等待,运行中完之后再remove
        try {
            ScheduledFuture<?> scheduledFuture = futuresMap.get(key);

            if (null != scheduledFuture) {
                scheduledFuture.cancel(false);
                futuresMap.remove(key);
                log.info("删除任务,任务池剩余长度:{}", futuresMap.size());
                if (null == futuresMap.get(key)) {
                    log.info("stop task success,taskId:{}", taskId);
                    return true;

                }
                else {
                    return false;

                }

            }

        }
        catch (Exception e) {
            log.error(e.getMessage(), e);

        }
        return false;

    }
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Vue.js和Django框架的结合来实现可自定义配置定时任务功能。 首先,你需要使用Vue.js来创建一个前端界面,让用户可以输入他们想要执行的任务和执行时间。这个前端界面可以使用Vue.js的组件来创建,包括表单输入、日期选择和时间选择等。 然后,你需要使用Django来创建一个后端API,让前端界面能够向它发送任务信息。这个API可以使用Django的REST框架来创建,包括一个POST请求来接收任务信息,并且将其保存到数据库中。 接下来,你需要使用Django的定时任务框架Celery来实现定时任务的执行。你需要定义一个Celery任务,这个任务会从数据库中读取任务信息并且在指定的时间执行任务。你还需要为每个任务创建一个定时器,这个定时器会在任务执行完成后重新计算下一次任务执行的时间。 最后,你需要使用Django的WebSocket框架来实现实时的任务状态更新。当任务执行时,你可以将任务状态发送到前端界面,让用户知道任务的进度和结果。这个WebSocket可以使用Django Channels来创建。 总结来说,使用Vue.js和Django的结合来实现可自定义配置定时任务功能需要以下几个步骤: 1. 创建一个Vue.js的前端界面,让用户输入任务信息和执行时间。 2. 创建一个Django的REST API,让前端界面能够向它发送任务信息。 3. 使用Django的Celery框架来实现定时任务的执行。 4. 使用Django的WebSocket框架来实现实时的任务状态更新。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值