后端技术:Java定时任务的五种创建方式
Quartz表达式生成地址:http://cron.qqe2.com/
支持生成定时任务表达式和反解析,使用Quartz表达式的定时任务如下
xxl-job
springboot 的 @Scheduled
Quartz 框架
一、job 定时任务的五种创建方式
1、使用线程创建 job 定时任务
/*** TODO 使用线程创建 job 定时任务* @author 王松*/
public class JobThread {public static class Demo01 {static long count = 0;public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(1000);count++;System.out.println(count);} catch (Exception e) {// TODO: handle exception}}}};Thread thread = new Thread(runnable);thread.start();}}
}
2、使用 TimerTask 创建job定时任务
/*** TODO 使用 TimerTask 创建job定时任务* @author 王松*/
public class JobTimerTask {static long count = 0;public static void main(String[] args) {TimerTask timerTask = new TimerTask() {@Overridepublic void run() {count++;System.out.println(count);}};//创建timer对象设置间隔时间Timer timer = new Timer();// 间隔天数long delay = 0;// 间隔毫秒数long period = 1000;timer.scheduleAtFixedRate(timerTask, delay, period);}
}
3、使用线程池创建 job定时任务
/*** TODO 使用线程池创建 job定时任务* @author 王松*/
public class JobScheduledExecutorService {public static void main(String[] args) {Runnable runnable = new Runnable() {@Overridepublic void run() {// task to run goes hereSystem.out.println("Hello !!");}};ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();// 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间service.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS);}
}
4.Quartz 框架
1.引入maven依赖
<dependencies><!-- quartz --><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency>
</dependencies>
2.任务调度类
public class MyJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {System.out.println("quartz MyJob date:" + System.currentTimeMillis());}
}
3.启动类
public class JobQuartz {public static void main(String[] args) throws SchedulerException {//1.创建Scheduler的工厂SchedulerFactory sf = new StdSchedulerFactory();//2.从工厂中获取调度器实例Scheduler scheduler = sf.getScheduler();//3.创建JobDetail,JobDetail jb = JobBuilder.newJob(MyJob.class)//job的描述.withDescription("this is a ram job")//job 的name和group.withIdentity("ramJob", "ramGroup").build();//任务运行的时间,SimpleSchedle类型触发器有效,3秒后启动任务long time= System.currentTimeMillis() + 3*1000L;Date statTime = new Date(time);//4.创建Trigger//使用SimpleScheduleBuilder或者CronScheduleBuilderTrigger t = TriggerBuilder.newTrigger().withDescription("").withIdentity("ramTrigger", "ramTriggerGroup")//.withSchedule(SimpleScheduleBuilder.simpleSchedule())//默认当前时间启动.startAt(statTime)//两秒执行一次,Quartz表达式,支持各种牛逼表达式.withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")).build();//5.注册任务和定时器scheduler.scheduleJob(jb, t);//6.启动 调度器scheduler.start();}
5. springboot 的 @Scheduled 注解
@Component
@Configuration //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务
public class SaticScheduleTask {@Scheduled(cron = "0/5 * * * * ?") //3.添加定时任务//@Scheduled(fixedRate=5000) //或直接指定时间间隔,例如:5秒private void configureTasks() {System.err.println("执行静态定时任务时间: " + LocalDateTime.now());}
}
二、xxl-job 任务调度后台 Admin
xxl-job 有什么用?
分布式集群的情况下,保证定时任务不被重复执行。
执行原理同Nginx 类型,所有定时任务通过任务调度平台分发,也可配置负载均衡等等
首先让我们能够使用起来,搭建一个自己的任务
第一步: github下载源码导入
下载地址:https://github.com/xuxueli/xxl-job/
当前版本目录结构 2.1.1
第二步: 执行sql
文件地址:xxl-job/doc/db/tables_xxl_job.sql
当前2.1.1版本sql
第三步: 修改xxl-job-admin项目配置
配置文件:application.properties
修改数据库连接
第四步: 启动admin项目
springboot 方式启动项目,
访问 http://localhost:8080/xxl-job-admin/
账号密码:admin / 123456
任务调度中心就搭建好了
接下来需要创建一个服务器连接任务调度中心
三、自创建boot项目的任务xxl-job 示例demo
创建一个 boot 项目
我的目录结构
pom.xml
web核心及 xxl-job-core
<!-- spring-boot-starter-web (spring-webmvc + tomcat) -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency><!-- xxl-job-core 版本号根据自己下载的版本修改 -->
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.1.1-SNAPSHOT</version>
</dependency>
logback.xml
日志配置直接拷贝
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds"><contextName>logback</contextName><property name="log.path" value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${log.path}</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern></rollingPolicy><encoder><pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern></encoder></appender><root level="info"><appender-ref ref="console"/><appender-ref ref="file"/></root></configuration>
application.properties 加入配置
需修改或自定义
xxl-job admin 地址
xxl.job.executor.appname 自定义名称,后台配置必须对应
xxl.job.executor.ip 当前电脑Ip,或部署项目的电脑Ip
xxl.job.executor.port 端口
# 端口号
server.port=8081
# 日志
logging.config=classpath:logback.xml### xxl-job admin 地址,多个逗号分隔"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin### xxl-job名称 || socket ip 当前项目部署的ip地址/本机ip || socket 端口号
xxl.job.executor.appname=xxl-job-executor-sample
xxl.job.executor.ip=192.168.43.153
xxl.job.executor.port=9999### xxl-job, access token
xxl.job.accessToken=
### xxl-job log path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job log retention days
xxl.job.executor.logretentiondays=-1
添加boot配置类 XxlJobConfig
package xxljob.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** xxl-job xxljob.config*/
@SuppressWarnings("ALL")
@Configuration
public class XxlJobConfig {private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);@Value("${xxl.job.admin.addresses}")private String adminAddresses;@Value("${xxl.job.executor.appname}")private String appName;@Value("${xxl.job.executor.ip}")private String ip;@Value("${xxl.job.executor.port}")private int port;@Value("${xxl.job.accessToken}")private String accessToken;@Value("${xxl.job.executor.logpath}")private String logPath;@Value("${xxl.job.executor.logretentiondays}")private int logRetentionDays;@Bean(initMethod = "start", destroyMethod = "destroy")public XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job xxljob.config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppName(appName);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);System.err.println(ip+":"+port);return xxlJobSpringExecutor;}/*** 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;** 1、引入依赖:* <dependency>* <groupId>org.springframework.cloud</groupId>* <artifactId>spring-cloud-commons</artifactId>* <version>${version}</version>* </dependency>** 2、配置文件,或者容器启动变量* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'** 3、获取IP* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();*/
}
任务job
@JobHandler(value="demoJobHandler")
@Component
public class DemoJobHandler extends IJobHandler {static int count;@Overridepublic ReturnT<String> execute(String param) throws Exception {System.out.println("执行job任务"+count++);return SUCCESS;}
}
admin 后台配置
执行管理器下
任务管理下编辑任务
定时规则生成:http://cron.qqe2.com/
job任务名:@JobHandler注解值 >> 如:@JobHandler(value=“demoJobHandler”)
启动
这样就配置完成了
完成
应用项目:https://gitee.com/wslxm/spring-boot-plus2
IT技术分享社区
个人博客网站:https://programmerblog.xyz
文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识
后端技术:Java定时任务的五种创建方式相关推荐
- 单例对象会被jvm的gc时回收吗_设计模式专题02-单例五种创建方式
单例五种创建方式(下一篇:工厂模式) 什么是单例 保证一个类只有一个实例,并且提供一个访问该全局访问点 单例应用场景 1. Windows的Task Manager(任务管理器)就是很典型的单例模式( ...
- Java 单例模式常见五种实现方式
定义 单例模式,属于创建类型的一种常用的软件设计模式. 单例模式最初的定义出现于<设计模式>(艾迪生维斯理, 1994):"保证一个类仅有一个实例,并提供一个访问它的全局访问点. ...
- Java多线程的11种创建方式以及纠正网上流传很久的一个谬误
创建线程比较传统的方式是继承Thread类和实现Runnable,也可以用内部类,Lambda表达式,线程池,FutureTask等. 经常面试会问到继承Thread类和实现Runnable的区别,然 ...
- java jdbc数据库五种连接方式
jdbc数据库连接方式(迭代) 方式五为最终版本 方式一 @Testpublic void testConnection() throws SQLException { // 1.获取Driver的实 ...
- java定时任务的两种实现方式
一.Timer 现在项目中用到需要定时去检查文件是否更新的功能.timer正好用于此处. 用法很简单,new一个timer,然后写一个timertask的子类即可. package comz.auto ...
- 图的创建(五种创建方式)
备忘 这里写目录标题 备忘 文档前提 1.邻接矩阵 1.1构建图 1.2遍历图 2.边集数组 2.1构建图 2.2遍历图 3.邻接表 3.1构建图 3.2遍历图 4.链式邻接表 4.1构建图 4.2遍 ...
- java如何实现定时任务_Java定时任务的三种实现方式
前言 现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了. 很多业务需求的实现都离不开定时任务,例如,每月一号,移动将清 ...
- 线程的常见的几种创建方式
线程的几种创建方式 文章目录 线程的几种创建方式 1. 继承Thread 2. 实现Runnable接口 3. 实现Callable接口 4. lamda表达式函数 5. 线程池 1. 继承Threa ...
- Java IO五种创建写入文件的方法
Java IO之5种创建写入文件的方法 Files.new BufferedWriter(Java 8) Files.writer(Java 7推荐) PrintWriter File.createN ...
最新文章
- Linux命令行与shell脚本编程大全:第2版
- 我的Android进阶之旅------Android项目目录结构分析
- 企业桌面安全管理解决方案
- 无人驾驶还不如一个导盲犬可靠吗
- 用什么方法才能测量出无线发射模块的功率呢?
- IIS7的Gzip压缩模式和IIS6的Gzip压缩模式性能对比 【转】
- 网络操控软件兴起:思科利润率受压
- 常见的java设计模式
- antd树形控件拖拽 改变数据位置
- 虚拟机VM 安装CoreOS
- Matlab出错向量长度必须相同,代码已贴。错误使用plot3,向量长度必须相同
- 企业微信二维码转成名片
- grpc原理及四种实现方式
- Python第一周学习总结
- 涂鸦画板,监听touch事件,手机端
- 【Linux】IRQ
- 详细设计说明书的书写格式
- Springboot+vue开发的图书借阅管理系统项目源码下载-P0029
- dpabi viewer使用
- yun mysql 安装_yun安装mysql
热门文章
- 最大最完整的---NAG Fortran 算法库
- 如何快速删除打印机任务
- 机器学习(machine learning)之AdaBoost算法
- 【常用网址】——opencv等
- 最优化作业第六章——共轭梯度法和鲍尔法
- for(;;)函数中判断条件执行顺序
- java构造块_java中的静态代码块、构造代码块、构造方法详解
- 运行快捷指令无法连接服务器失败,快捷指令打不开怎么回事?iPhone快捷指令无法载入的解决办法...
- 在python是什么意思_python 的 表示什么
- javascript是一门多线程的语言_Javascript:10天设计一门语言