前言

在之前的springboot整合elastic-job篇中,我们了解到,elastic-job是一个不错的任务调度框架,本篇将进一步说明,如何使用elastic-job实现常用的动态任务的执行场景

环境准备

zookeeper安装与启动(本地可以使用windows版,比较快捷)

简易工程搭建

1、添加基础pom依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.1.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><mybatis-plus-boot-starter.version>3.3.0</mybatis-plus-boot-starter.version><mybatis-plus-generator.version>3.3.0</mybatis-plus-generator.version><swagger.version>2.9.2</swagger.version><swagger-bootstrap-ui.version>1.9.6</swagger-bootstrap-ui.version></properties><dependencies><!--swagger-ui--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${swagger.version}</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>${swagger-bootstrap-ui.version}</version></dependency><!-- https://mvnrepository.com/artifact/com.dangdang/elastic-job-lite-spring --><!--<dependency><groupId>com.github.kuhn-he</groupId><artifactId>elastic-job-lite-spring-boot-starter</artifactId><version>2.1.5</version></dependency>--><dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-core</artifactId><version>2.1.5</version></dependency><dependency><groupId>com.dangdang</groupId><artifactId>elastic-job-lite-spring</artifactId><version>2.1.5</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.2.1.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency><!-- MyBatis增强工具--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus-boot-starter.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>${mybatis-plus-generator.version}</version></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.0</version></dependency></dependencies>

2、配置文件配置zk信息

elastic-job的任务调度,在运行的时候依赖zk,因此需要根据自身情况配置zk,可以理解为任务需要结合zk的节点进行使用,如果不需要数据库连接可以忽略


server.port=8081# zookeeper集群
elaticjob.zookeeper.server-lists=127.0.0.1:2181
elaticjob.zookeeper.namespace=updatetask#动态配置
zkserver= 127.0.0.1:2181
zknamespace=zknamespce#动态配置2
elasticjob.serverlists=127.0.0.1:2181
elasticjob.namespace=boot-jobspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://IP:3306/dbname?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=rootmybatis-plus.mapper-locations=classpath*:mapper/*.xml
mybatis-plus.global-config.db-column-underline=true
mybatis-plus.global-config.db-config.id-type=uuid
mybatis-plus.global-config.db-config.field-strategy=not_null
mybatis-plus.global-config.refresh=true
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

3、配置ElasticJob相关

包括zk注册中心,elastic-job监听器等

import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperConfiguration;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@Data
public class ElasticJobConfig {@Value("${elasticjob.serverlists}")private String serverLists;@Value("${elasticjob.namespace}")private String namespace;@Beanpublic ZookeeperConfiguration zConfig(){return new ZookeeperConfiguration(serverLists, namespace);}@Bean(initMethod = "init")public ZookeeperRegistryCenter registryCenter(ZookeeperConfiguration config){return new ZookeeperRegistryCenter(config);}@Beanpublic ElasticJobListener elasticJobListener(){return new ElasticJobListener(1000L, 10000L);}
}

4、动态任务处理配置类

主要包括动态任务的增删改

import com.dangdang.ddframe.job.api.simple.SimpleJob;
import com.dangdang.ddframe.job.config.JobCoreConfiguration;
import com.dangdang.ddframe.job.config.simple.SimpleJobConfiguration;
import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener;
import com.dangdang.ddframe.job.lite.config.LiteJobConfiguration;
import com.dangdang.ddframe.job.lite.internal.schedule.JobRegistry;
import com.dangdang.ddframe.job.lite.spring.api.SpringJobScheduler;
import com.dangdang.ddframe.job.reg.zookeeper.ZookeeperRegistryCenter;
import org.springframework.stereotype.Component;import javax.annotation.Resource;@Component
public class ElasticJobHandler {@Resourceprivate ZookeeperRegistryCenter registryCenter;@Resourceprivate ElasticJobListener elasticJobListener;private static LiteJobConfiguration.Builder simpleJobConfigBuilder(String jobName,Class<? extends SimpleJob> jobClass,int shardTotalCount,String cron,String id) {return LiteJobConfiguration.newBuilder(new SimpleJobConfiguration(JobCoreConfiguration.newBuilder(jobName,cron,shardTotalCount).jobParameter(id).build(),jobClass.getCanonicalName()));}/*** 添加定时任务*/public void addJob(String jobName, SimpleJob jobInstance, String cron, Integer shardTotalCount, String id) {LiteJobConfiguration jobConfig = simpleJobConfigBuilder(jobName, jobInstance.getClass(), shardTotalCount, cron, id).overwrite(true).build();new SpringJobScheduler(jobInstance,registryCenter,jobConfig,elasticJobListener).init();}/*** 修改定时任务* @param jobName* @param cron*/public void updateJob(String jobName, String cron) {JobRegistry.getInstance().getJobScheduleController(jobName).rescheduleJob(cron);}/*** 移除定时任务* @param jobName*/public void removeJob(String jobName){JobRegistry.getInstance().getJobScheduleController(jobName).shutdown();}
}

5、接口实现任务的增删改

import com.congge.task.config.ElasticJobHandler;
import com.congge.task.config.MyElasticJob;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/task")
public class ElasticController {@Autowiredprivate ElasticJobHandler jobHandler;@GetMapping("/add")public Object addJob(String jobName,String cronExpress){if(StringUtils.isEmpty(jobName)){jobName = "test-job";}if(StringUtils.isEmpty(cronExpress)){cronExpress = "1/5 * * * * ?";}jobHandler.addJob(jobName, new MyElasticJob(), cronExpress, 1, "1");return "add success";}@GetMapping("/update")public Object updateJob(String jobName,String cronExpress){if(StringUtils.isEmpty(jobName)){jobName = "test-job";}if(StringUtils.isEmpty(cronExpress)){cronExpress = "1/5 * * * * ?";}jobHandler.updateJob(jobName,cronExpress);return "update success";}@GetMapping("/remove")public Object removeJob(String jobName){jobHandler.removeJob(jobName);return "remove success";}}

下面来测试一下接口是否好用,我们先来添加一个任务


可以看到,后台已经开始执行任务,由于我们没有给执行cron,默认值每隔5秒执行一次

当然,我们也可以连接elastic-job的控制台,看到我们后台正在运行的job,可以通过管控台对job进行处理,比如我们停止这个job

当点击关闭之后,任务将不再执行

与实际的业务整合

经常有这样的场景,我们需要对数据库的某个表的数据进行状态值修改,或者定时备份某个表的数据,或者执行一些特殊任务等,都可以使用elastic-job来完成

具体来说,只需要在实现了SimpleJob的类中的execute方法里面去做就可以了,例如有这样一个场景,每隔5秒需要对user表中状态为1的数据进行修改

那么就可以直接改造MyElasticJob这个类

public class MyElasticJob implements SimpleJob {UserService userService = SpringContextUtil.getBean("userService");@Overridepublic void execute(ShardingContext shardingContext) {String jobName = shardingContext.getJobName();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");System.out.println("任务:" + jobName +",执行" + "时间:" + simpleDateFormat.format(new Date()));//执行具体的任务userService.changeStatus();}
}

如果有更多的业务要处理,可以类似的操作,下面启动工程,添加一个任务来执行下,看看是否能打到预期的目的,



可以看到,执行之后,status的值变成了-1

以上是本文的全部内容,实际应用中,还需要结合较多的因素进行改造,希望对您有帮助哦

有需要源码的同学可前往下载:https://download.csdn.net/download/zhangcongyi420/22501493

elastic-job动态任务配置相关推荐

  1. 动态主机配置协议服务器不能提供,计算机网络基础课程—动态主机配置协议(Dhcp)...

    原标题:计算机网络基础课程-动态主机配置协议(Dhcp) DHCP(RFC 2131,2132)是对BOOTP的扩展,这种扩展体现在两个方面: 能在一个DHCP消息中为客户提供所有的网络配置信息,如I ...

  2. Spring Boot 2.x基础教程:使用Elastic Job的分片配置

    上一篇,我们介绍了如何使用Elastic Job实现定时任务(https://blog.didispace.com/spring-boot-learning-2-7-2/).解决了使用@Schedul ...

  3. 【NET CORE微服务一条龙应用】第三章 认证授权与动态权限配置

    [NET CORE微服务一条龙应用]第三章 认证授权与动态权限配置 介绍 系列目录:[NET CORE微服务一条龙应用]开始篇与目录 在微服务的应用中,统一的认证授权是必不可少的组件,本文将介绍微服务 ...

  4. eigrp配置实验_路由器 OSPF 动态路由配置

    本文档详细介绍路由器 OSPF 动态路由配置的方法,文内含长段代码可复制可往左滑,希望对大家有帮助! 实验目的 掌握 OSPF 协议的配置方法 掌握查看通过动态路由协议 OSPF 学习产生的路由 熟悉 ...

  5. 思科路由器动态NAT配置

    相关学习推荐: 优秀的网工都会NAThttps://blog.csdn.net/XMWS_IT/article/details/121508603?spm=1001.2014.3001.5502 微思 ...

  6. 域名系统DNS、文件传送协议FTP、动态主机配置协议DHCP、远程登录协议TELNET、电子邮件协议(SMTP/POP3/IMAP)、常用端口

    1.DNS域名系统 Domain Name System DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务. 这里的分布式数据库是指,每个站点只保留它自己的那部分数据. 域名具 ...

  7. Spring Security——基于读写锁的动态权限配置FilterInvocationSecurityMetadataSource实现类

    问题描述 每次都加载资源,效率低下. 解决方案 /*** @author ShenTuZhiGang* @version 1.2.0* @date 2020-03-07 21:57*/ @Slf4j ...

  8. 网际协议:动态主机配置协议(DHCP)和NAT

    一.DHCP 某组织一旦获得了一块地址,它就可以为本组织内的主机与路由器接口逐个分配IP地址. 主机地址可以手动配置,但是这项任务目前通常更多的是使用动态主机配置协议(DHCP). DHCP允许一个主 ...

  9. 计算机网络实验(华为eNSP模拟器)——第八章 动态主机配置协议(DHCP)

    目录 前言 一.DHCP的定义 二.接口模式的 DHCP 命令 (1)开启DHCP配置功能 (2)开启接口的DHCP功能 (3)设置排除地址 (4)设置地址池ip租用有效期 (5)设置DNS地址 (6 ...

  10. ENSP配置 实例九 动态Nat配置

    ENSP配置 实例九 动态Nat配置 sy [Huawei]sy R1 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.1.254 24 ...

最新文章

  1. Springboot 使用thymeleaf模板layout布局
  2. 麻省理工人工智能实验室发现更小更容易训练的神经网络
  3. Tungsten Fabric SDN — 与 OpenStack 的集成架构
  4. 小技巧:远程连接共享文件密码错误
  5. linux中负载值为多少正常_Linux load average负载量分析与解决思路
  6. go基础库之环境变量的获取与设置以及如何使用默认值
  7. LeetCode 1360. 日期之间隔几天(闰年判断)
  8. 28 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义行标识
  9. post发送请求参数注意的问题
  10. Linux IO调度器相关算法介绍
  11. [转载] python中的且语句_简单探讨python中的语句和语法
  12. Java学习笔记基础(下)
  13. js基础-21-事件委托
  14. 简易呼吸灯c语言程序,呼吸灯 - 单片机教程 - C语言网
  15. 什么叫软件前端测试,前端页面测试需要测试哪些内容?前端自动化测试的实现小技巧...
  16. Rust_lings
  17. 风暴数码论坛教程--初识Android
  18. 系统辨识与自适应控制matlab程序_杂志精选 | 自适应声反馈抑制技术及其应用
  19. 软件安装【持续更新ing】
  20. arris sbr-ac1900p/sbr-ac3200p梅林固件

热门文章

  1. 多个命令执行结果输出到同一个文件(批处理)
  2. 数据挖掘学习06 - 《数据挖掘导论》导读
  3. 现在Windows Server 2012在Windows Azure 虚拟机库中可用
  4. 基于Cmail的邮件收发限制说明
  5. [CF Skills]如何在预定的时间运行你的程序
  6. ROS系统MoveIt玩转双臂机器人系列(二)--生成MoveIt配置包
  7. CentOS 6.4 yum安装LAMP环境
  8. 搜索框中“请输入搜索keyword”
  9. Application Constants
  10. away3d 4.0.9Gold 学习笔记 加载模型(6)