栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot的5种任务调度

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot的5种任务调度

​​​​​​​​​​​​​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
            quartz
            2.2.1
        
        
            org.quartz-scheduler
            quartz-jobs
            2.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

+加关注

<2021年9月">>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
搜索

常用链接
  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论
  • 我的标签
我的标签
  • 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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351491.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号