Quartz表达式生成地址: http://cron.qqe2.com/
----支持生成定时任务表达式和反解析,使用Quartz表达式的定时任务如下
1、xxl-job
2、springboot 的 @Scheduled
3、Quartz 框架
一、job 定时任务的五种创建方式
1、使用线程创建 job 定时任务
public class JobThread {
public static class Demo01 {
static long count = 0;
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public 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定时任务
public class JobTimerTask {
static long count = 0;
public static void main(String[] args) {
TimerTask timerTask = new TimerTask() {
@Override
public 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 王松
* @date 2019/9/14 0014 20:56
*/
public class JobScheduledExecutorService {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
// task to run goes here
System.out.println("Hello !!");
}
};
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
// 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
service.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS);
}
}
4.Quartz 框架
1.引入maven依赖
org.quartz-scheduler quartz2.2.1 org.quartz-scheduler quartz-jobs2.2.1
2.任务调度类
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("quartz MyJob date:" + System.currentTimeMillis());
}
}
启动类
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或者CronScheduleBuilder
Trigger 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
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
com.xuxueli
xxl-job-core
2.1.1-SNAPSHOT
logback.xml
日志配置直接拷贝
logback %d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n ${log.path} ${log.path}.%d{yyyy-MM-dd}.zip %date %level [%thread] %logger{36} [%file : %line] %msg%n
application.properties 加入配置
-----需修改或自定义
1、xxl-job admin 地址
2、xxl.job.executor.appname 自定义名称,后台配置必须对应
3、xxl.job.executor.ip 当前电脑Ip,或部署项目的电脑Ip
4、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;
@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;
}
}
任务job
@JobHandler(value="demoJobHandler")
@Component
public class DemoJobHandler extends IJobHandler {
static int count;
@Override
public ReturnT execute(String param) throws Exception {
System.out.println("执行job任务"+count++);
return SUCCESS;
}
}
admin 后台配置
执行管理器下
任务管理下
编辑任务
定时规则生成:http://cron.qqe2.com/
job任务名:@JobHandler注解值 >> 如:@JobHandler(value=“demoJobHandler”)
启动
这样就配置完成了
————————————————
版权声明:本文为CSDN博主「兮家小二」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41463655/article/details/100839629
喜欢这篇文章, 觉得有收获?欢迎打赏~~
想要内推大厂的小伙伴也可以联系我~
分类: java
好文要顶 关注我 收藏该文
苍青浪
关注 - 8
粉丝 - 306
+加关注
0
0
« 上一篇: 一步步实现 Redis 搜索引擎
» 下一篇: Pandas 数据清洗
posted @ 2021-06-16 10:06 苍青浪 阅读(165) 评论(0) 编辑 收藏 举报
刷新评论刷新页面返回顶部
登录后才能查看或发表评论,立即 登录 或者 逛逛 博客园首页
【推荐】百度智能云超值优惠:新用户首购云服务器1核1G低至69元/年
【推荐】跨平台组态工控仿真CAD 50万行C++源码全开放免费下载!
【推荐】阿里云云大使特惠:新用户购ECS服务器1核2G最低价87元/年
【推荐】和开发者在一起:华为开发者社区,入驻博客园科技品牌专区
【推广】园子与爱卡汽车爱宝险合作,随手就可以买一份的百万医疗保险
编辑推荐:
· 妙用 background 实现花式文字效果
· Go 并发编程 -- 正确使用 goroutine
· 前端瓦片地图加载之塞尔达传说旷野之息
· 技术管理进阶 —— 关于成本优化与利益分配机制
· 微前端框架single-spa初探
最新新闻:
· 华为汽车:近期将有多个激动人心时刻出现(2021-09-17 13:35)
· 哈啰出行成立五周年CEO杨磊透露:注册用户接近5亿人(2021-09-17 13:28)
· 达达快送发布达达智配SaaS系统,提升即时配送行业效能(2021-09-17 13:21)
· 专家:互联互通是狙击互联网无效内卷的有力武器(2021-09-17 13:14)
· 马斯克:特斯拉要与各国政府一同确保智能网联汽车的数据安全(2021-09-17 13:07)
» 更多新闻...
历史上的今天:
2020-06-16 滑动窗口
2020-06-16 流量控制(滑动窗口)和 拥塞控制(拥塞控制的工作过程)
你都复制了些什么呀,转载要记得加上出处哦
昵称: 苍青浪
园龄: 3年8个月
粉丝: 306
关注: 8
+加关注
| |||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
|---|---|---|---|---|---|---|---|---|---|
| 29 | 30 | 31 | 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
| 12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
| 19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
| 26 | 27 | 28 | 29 | 30 | 1 | 2 | |||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
- 我的随笔
- 我的评论
- 我的参与
- 最新评论
- 我的标签
- cron(1)
- 技巧(1)
- javascript(1)
- git(1)
- 积分 - 1039660
- 排名 - 200
- apache(4)
- AST(1)
- css和ui组件库(18)
- C语言(2)
- Django(5)
- Docker及k8s(19)
- Egg(2)
- Elasticsearch(13)
- electron(1)
- express(3)
- git(21)
- golang(3)
- http(15)
- java(85)
- java web(5)
- Javascript(191)
- jQuery源码(4)
- JSX高级指南(4)
- js工具库(6)
- kafka(2)
- Koa(7)
- krpano(2)
- linux(71)
- Maven(5)
- MongoDB (19)
- Mybatis(9)
- nginx(30)
- node(72)
- pandas数据分析(5)
- php(21)
- Python(52)
- react(10)
- React Native(6)
- Redis(23)
- Redux(6)
- servlet(1)
- shell(45)
- SpringMVC(8)
- TCP(22)
- Tomcat(1)
- 更多
- 2021年9月(7)
- 2021年8月(24)
- 2021年7月(23)
- 2021年6月(18)
- 2021年5月(22)
- 2021年4月(15)
- 2021年3月(20)
- 2021年2月(7)
- 2021年1月(17)
- 2020年12月(20)
- 2020年11月(7)
- 2020年10月(14)
- 2020年9月(12)
- 2020年8月(3)
- 2020年7月(14)
- 2020年6月(16)
- 2020年5月(6)
- 2020年4月(15)
- 2020年3月(48)
- 2020年2月(11)
- 2020年1月(18)
- 2019年12月(32)
- 2019年11月(28)
- 2019年10月(29)
- 2019年9月(30)
- 2019年8月(43)
- 2019年7月(29)
- 2019年6月(17)
- 2019年5月(24)
- 2019年4月(42)
- 2019年3月(23)
- 2019年2月(6)
- 2019年1月(31)
- 2018年12月(59)
- 2018年11月(35)
- 2018年10月(29)
- 2018年9月(7)
- 2018年8月(22)
- 2018年7月(34)
- 2018年6月(30)
- 更多
- 1. Re:package-lock.json的作用
-
####dddcd
- --uuneng
- 2. Re:MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本
-
你好,图片加载不出来了
- --dvfgdf
- 3. Re:Nginx中server_name 参数详解
- @苍青浪 解析了,现在问题解决了,原因是放在nginx的sites-available里的mysite.conf配置文件没有被调用...
- 请问server_name后面写了域名但是没起作用是什么问题
- --霜序见我
- 1. package-lock.json的作用(183266)
- 2. Linux下查看Nginx安装目录、版本号信息及当前运行的配置文件(147286)
- 3. @Param注解的用法解析(116281)
- 4. Nginx中server_name 参数详解(78507)
- 5. @JsonFormat时间格式化注解使用(67514)
- 6. 移动端触摸(touch)事件(55202)
- 7. Java基础知识总结(绝对经典)(50222)
- 8. Intellij Idea 创建JavaWeb项目入门(一)(44090)
- 9. 浏览器清理缓存的几种方法(43220)
- 10. Websocket(一)——原理及基本属性和方法(41985)
- 1. package-lock.json的作用(14)
- 2. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理(11)
- 3. Java基础知识总结(绝对经典)(10)
- 4. 详解Javascript中的Event Loop(事件循环)机制(10)
- 5. mongo aggregate聚合之 $addFields(6)
- 6. 实现一个大文件上传和断点续传(5)
- 7. vue实现element-ui对话框可拖拽功能(5)
- 8. Nginx中server_name 参数详解(5)
- 9. 移动端触摸(touch)事件(5)
- 10. 将NodeJS项目打包,编译成跨平台的可执行文件(4)
- 1. package-lock.json的作用(28)
- 2. 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理(16)
- 3. 详解Javascript中的Event Loop(事件循环)机制(10)
- 4. Java基础知识总结(绝对经典)(9)
- 5. 移动端触摸(touch)事件(8)
Copyright © 2021 苍青浪
Powered by .NET 6 on Kubernetes



