分布式任务调度-LTS

目录

  • 为什么使用分布式任务调度
  • SpringBoot 整合 LTS
    • 官网介绍
    • 代码示例
  • 推荐公众号

为什么使用分布式任务调度

  1. 公司又N多项目,每个项目中几乎都有定时任务,如何管理
  2. 定时任务如何修改参数,暂停,查看日志,甚至是删除

等等暂时没有想出来

以上如果有一个可视化界面来操作岂不美哉

SpringBoot 整合 LTS

官网介绍

照着文档一步一步,拉代码,起节点就ok了

原理,源码中写的牛逼的地方日后再曰

https://gitee.com/hugui/light-task-scheduler

代码示例

项目地址[email protected]:ZhZGod/lts-springboot.git

大致过程
提交任务   派发任务   执行任务   反馈任务结果


提交任务
Job job = new Job();
//任务表达式 如果没有此参数即为立即执行
job.setCronExpression(cron);
//任务参数  执行任务是可根据key获取
Map params = new HashMap<>();
params.put("message", message);
params.put("type", type);
//任务taskid 唯一值重复会更新任务信息(猜测不同节点组一样不会更新的,未验证)
job.setTaskId(taskId);
//参数
job.setExtParams(params);
//节点
job.setTaskTrackerNodeGroup(taskTrackerNodeGroup);


派发任务
public static final String TEST_LTS_TASK = "test_lts_task";

private static final ConcurrentHashMap
        JOB_RUNNER_MAP = new ConcurrentHashMap();

@PostConstruct
public void init() {
    JOB_RUNNER_MAP.put(TEST_LTS_TASK, BeanUtils.getBeanName(LtsTestTask.class));
    JOB_RUNNER_MAP.put(LtsPageTask.LTS_PAGE_TASK_TYPE, BeanUtils.getBeanName(LtsPageTask.class));
}

@Override
public Result run(JobContext jobContext) throws Throwable {
    Job job = jobContext.getJob();
    //根据参数中的type 获取对应处理bean
    String type = job.getParam("type");
    String beanName = JOB_RUNNER_MAP.get(type);
    log.info("lts dispatch beanName:{}, job:{}", beanName, job.getExtParams());
    ApplicationContext applicationContext = BeanUtils.getApplicationContext();
    return ((JobRunner) applicationContext.getBean(beanName)).run(jobContext);
}

执行任务和反馈结果
public Result run(JobContext jobContext) throws Throwable {
    Job job = jobContext.getJob();
    log.info("{}, 执行任务", JobRunnerDispatcher.TEST_LTS_TASK);
    String message = job.getParam("message");
    System.out.println(String.format("job中任务,message=%s", message));
    Result result = new Result();
    result.setMsg(JobRunnerDispatcher.TEST_LTS_TASK + "执行完成");
    return result;
}

推荐公众号

有彩蛋哦!!!(或者公众号内点击网赚获取彩蛋)
程序员探索之路

你可能感兴趣的:(分布式任务)