@Scheduled,Quartz,XXL-Job三种定时任务总结
一、@Scheduled
-
简介
@Schedule是Spring框架提供的一种简单的定时任务调度方法,通过注解的方式即可实现定时任务的调度。它适用于简单的定时任务需求,例如每隔一段时间执行一次任务或者在特定时间执行任务。@Scheduled可以轻松地集成到Spring应用中,但在处理复杂地调度需求时可能显得不够灵活。
-
代码示例
首先建好一个Spring Boot项目,写一个Service方法,再方法上加上注解@Scheduled,通过cron表达式来指定什么时候执行该方法(可以在网上搜索在线cron表达式生成器),下面的cron表达式表示的就是项目启动后,每5秒执行一次该方法
@Service public class TimerServiceImpl implements ITimerService { @Override @Scheduled(cron = "0/5 * * * * ?") public void testScheduled() { //每5秒执行一次 System.out.println("我执行了一次testScheduled()"); } }
还有一点,需要在启动类上面加上@EnableScheduling注解开启Spring的任务调度功能
@SpringBootApplication @EnableScheduling public class JobApp { public static v服务器托管网oid main(String[] args) { SpringApplication.run(JobApp.class); } }
项目启动后,你就能看到控制台每5秒就会打印一句话了
二、Quartz
-
简介
Quartz是一个功能强大的、开源的定时任务调度框架,提供了丰富的功能和灵活的调度管理。它支持复杂的调度需求,作业持久化、集群部署等功能。Quartz可以与Spring等框架无缝集成,被广泛应用于企业级应用中。
-
代码示例
pom.xml中导入依赖
dependency> groupId>org.springframework.bootgroupId> artifactId>spring-boot-starter-quartzartifactId> dependency>
创建一个定时器任务,实现QuartzJobBean接口的方法
public class MyJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("我是定时器quartz,准备运行..."); } }
创建一个配置类,构建定时任务触发器
@Configuration public class JobConfig { @Bean public JobDetail jobDet服务器托管网ail() { return JobBuilder.newJob(MyJob.class) .storeDurably(true) .build(); } @Bean public Trigger trigger() { //用于创建一个和先前创建的定时器任务关联起来的触发器,设置触发器时间为每隔5秒 return TriggerBuilder.newTrigger() .forJob(jobDetail()) .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); } }
项目启动后,你就能看到控制台每5秒就会打印一句话了
无论是@Scheduled,还是Quartz实现的定时任务,其实都只适合于单台服务器,试想,如果是分布式项目,多台服务器呢?在分布式项目中,多台服务器同时执行定时任务可能会导致数据重复写入的问题,因此需要考虑采取措施来确保定时任务的唯一性和一致性,而接下来要讲的XXL-Job就能解决这个问题。
三、XXL-Job
-
简介
XXL-Job是一个分布式任务调度平台,提供了可视化的任务管理界面、任务的动态添加、修改、删除等功能。它支持分布式部署,并提供了任务执行日志、任务运行状态等监控功能。XXL-Job是为了解决分布式系统中任务调度的问题而设计的,适合于大规模分布式系统中的定时任务调度。
-
安装
这里我们使用docker-compose安装它的docker版
查找镜像,我们选择这个STARS最多的xuxueli/xxl-job-admin
[root@woniu ~]# docker search xxl-job NAME DESCRIPTION STARS OFFICIAL AUTOMATED vulhub/xxl-job 1 xuxueli/xxl-job-admin A lightweight distributed task scheduling fr… 150 robotjerry/xxl-job-executor 0
建一个目录xxl-job,在它下面建一个logs目录和一个docker-compose.yml文件
[root@woniu xxl-job]# pwd /usr/local/software/xxl-job [root@woniu xxl-job]# ls docker-compose.yml logs
编辑docker-compose.yml(这个build: .是读取当前目录下的Dockerfile构建镜像用的,这里没有Dockerfile,所以我注释了)
version: '2' #自定义的docker网络 networks: wn_docker_net: external: true services: xxl-job-compose: #读取Dockerfile #build: . #镜像名称 image: xuxueli/xxl-job-admin:2.3.1 #容器名称 container_name: xxl-job ports: - '9898:8080' environment: PARAMS: '--spring.datasource.url=jdbc:mysql://192.168.102.100:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123' volumes: - /usr/local/software/xxl-job/logs:/data/applogs networks: wn_docker_net: ipv4_address: 172.18.12.100
去官网https://www.xuxueli.com/xxl-job/的github或gitee里的doc/db目录下找到建库语句tables_xxl_job.sql建数据库
docker-compose up -d后台构建执行
浏览器输入(ip用你自己虚拟机的ip)192.168.102.100:9898/xxl-job-admin,用户名admin密码123456
-
Spring Boot整合XXL-Job
pom.xml导入依赖
dependency> groupId>com.xuxueligroupId> artifactId>xxl-job-coreartifactId> version>2.3.1version> dependency>
配置application-dev.yml(在application.yml里激活dev),进行一些执行器的配置
server: port: 13000 #xxljob的配置 xxl: job: admin: addresses: http://192.168.102.100:9898/xxl-job-admin/ executor: appname: xxl-job-executor-sample port: 9777 accessToken: default_token logging: level: com.wnhz.ssc: debug
创建XxlJobConfig配置类,配置执行器组件
@Configuration @Slf4j public class XxlJobConfig { @Value("${xxl.job.admin.addresses}") private String addresses; @Value("${xxl.job.executor.appname}") private String appName; @Value("${xxl.job.executor.port}") private int port; @Value("${xxl.job.accessToken}") private String accessToken; @Bean public XxlJobSpringExecutor xxlJobExecutor() { XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(addresses); xxlJobSpringExecutor.setAppname(appName); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); log.debug("xxl-job初始化成功:{}", xxlJobSpringExecutor); return xxlJobSpringExecutor; } }
创建定时任务(记住@XXlJob中的值hellXxl,之后要用到)
@Component @Slf4j public class MyJobs { @XxlJob("hellXxl") public void hellXxlJob() { log.debug("hello,xxl-job"); } }
在XXL-Job任务调度中心中的任务管理中添加任务
点击启动(别忘了启动你的Spring Boot项目),然后你就可以在控制台上看到每5秒打印一句话了
四、总结
总的来说,如果只需要简单的定时任务调度,可以使用@Scheduled注解;如果需要更复杂的调度需求和企业级应用,可以选择Quartz;如果系统是一个大规模的分布式系统,需要分布式任务调度平台,那么XXL-Job是一个更好的选择。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 如何在CentOS上安装SQL Server数据库并通过内网穿透工具实现远程访问
文章目录 前言 1. 安装sql server 2. 局域网测试连接 3. 安装cpolar内网穿透 4. 将sqlserver映射到公网 5. 公网远程连接 6.固定连接公网地址 7.使用固定公网地址连接 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人…