精选汽车资讯网

您现在的位置是: 首页 > 车型报价

文章内容

java quartz 教程_java quarter_1

ysladmin 2024-05-30
java quartz 教程_java quarter       非常感谢大家聚集在这里共同探讨java quartz 教程的话题。这个问题集合涵盖了java quartz 教程的广泛内容,我将用我的知识和经验为大家
java quartz 教程_java quarter

       非常感谢大家聚集在这里共同探讨java quartz 教程的话题。这个问题集合涵盖了java quartz 教程的广泛内容,我将用我的知识和经验为大家提供全面而深入的回答。

1.java定时执行问题: 我想让一个Java代码在每小时的第25分钟执行一次的,这个怎么实现?

2.quartz中怎么为每一个任务添加日志

3.quartz作业调度的应用和原理

4.用java实现定时任务要稳定的。谁帮实现一下。 比如: 每天早上8点输出一句话。(天天早上8点都输出).

5.Java中定时任务quartz如何将历史数据写入新表

6.java中quartz定时任务的执行如何避免并发

java quartz 教程_java quarter

java定时执行问题: 我想让一个Java代码在每小时的第25分钟执行一次的,这个怎么实现?

       用spring quartz

       public class MyJob{

        //这里如果你定义实例变量,可用spring依赖注入,例如

        private String job;

        public void setJob(String job){

        this.job = job;

        }

        //你要执行的操作

        public void execute(){

        }

       }

       spring 配置文件

       beans-config.xml

       <?xml version="1.0" encoding="UTF-8"?>

       <beans xmlns="http://www.springframework.org/schema/beans"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xsi:schemaLocation="http://www.springframework.org/schema/beans

       http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

        <bean id = "myJob" class="MyJob">

        <!--如果有注入属性在这里写 <property name = "job" value="hihi"></property> -->

        </bean>

        <bean id = "myjobDetail" class = "org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

        <property name="targetObject" ref="myJob">

        </property>

        <property name="targetMethod" value="execute"></property>

        </bean>

        <bean id ="triggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">

        <property name="jobDetail" ref="myjobDetail"/>

        <!-- 秒 分 小时 天 月 年-->

        <property name="cronExpression" value="0 25 * * * ?"/>

        </bean>

        <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

        <property name="triggers">

        <list><ref bean = "triggerBean"/></list>

        </property>

        </bean>

       </beans>

       在主类中读取定义文件,任务计划自动运行。

       public class Test(){

        public void static main(String[] args){

        ApplicationContext context = new ClassPathXmlApplicationContext("beans-config.xml");

       }

       }

       将配置文件放在该项目的classpath下,一般你放在src目录下即可。也可以自己创建路径放置,在项目的.classpath中可配置下此路径。

       最后导入spring的jar包就可以了。

quartz中怎么为每一个任务添加日志

       import?java.util.Random;

       import?java.util.Timer;

       import?java.util.TimerTask;

       public?class?MainEntry?{

private?int?a;

public?void?setVal(){

Timer?timer?=?new?Timer();

//每隔一秒生成一个[1,100)内的随机整数,赋给成员a

timer.schedule(new?TimerTask()?{?

       @Override

       public?void?run()?{

       Random?rand?=?new?Random();

       setA(rand.nextInt(100));

       }

},?1000);

}

public?void?setA(int?a)?{

this.a?=?a;

}

public?int?getA()?{

return?a;

}

public?static?void?main(String[]?args)?{

MainEntry?me?=?new?MainEntry();

me.setVal();

}

       }

quartz作业调度的应用和原理

       } import static org.quartz.CronScheduleBuilder.cronSchedule;import static org.quartz.JobBuilder.newJob;import static org.quartz.TriggerBuilder.newTrigger;import java.text.SimpleDateFormat;import java.util.Date;import org.quartz.CronTrigger;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.impl.StdSchedulerFactory;public class Test { public void go() throws Exception { // 首先,必需要取得一个Scheduler的引用 SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); //jobs可以在scheduled的sched.start()方法前被调用 //job 1将每隔30分钟执行一次 JobDetail job = newJob(myJob.class).withIdentity("job1", "group1").build(); CronTrigger trigger = newTrigger().withIdentity("trigger1", "group1").withSchedule(cronSchedule("0 0/30 * * * ?")).build(); Date ft = sched.scheduleJob(job, trigger); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); System.out.pintln("aa"); // 开始执行,start()方法被调用后,计时器就开始工作,计时调度中允许放入N个Job sched.start(); try { //主线程等待一分钟 Thread.sleep(60L * 1000L); } catch (Exception e) {} //关闭定时调度,定时器不再工作 sched.shutdown(true);} public static void main(String[] args) throws Exception { Test test = new Test(); test.go(); }}

用java实现定时任务要稳定的。谁帮实现一下。 比如: 每天早上8点输出一句话。(天天早上8点都输出).

       Quartz是一款由java写成的作业调度框架,在大量javase/javaee应用中被用来做定时任务,它功能强大而又不失使用简单性。

        Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。

        1、Job

        表示一个工作,要执行的具体内容。此接口中只有一个方法

        void execute(JobExecutionContext context)

        线程运行Job时会把JobDataMap封装到JobExecutionContext里作为execute方法的参数,jobdetail是对job的封装,里面有Job的class,对应的数据, 名称,分组等

        2、JobDetail

        JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。

        3、Trigger代表一个调度参数的配置,job下次什么时候执行存放在trigger中。

        4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。

        5、QuartzSchedulerResources相当于调度的资源存放器,包含了JobStore, ThreadPool等资源,调度都是通过QuartzSchedulerResources获取相关属性的。

        6、jobStore是任务和触发器存储地方,它里面提供大量类似于增删改的操作任务方法。

        5、QuartzSchedulerThread是一个调度线程,ThreadPool是一个执行线程池,下图是运行后的线程栈:

        Quartz是通过对用户暴露出Scheduler来进行任务的操作,它可以把任务JobDetail和触发器Trigger加入任务池中,可以把任务删除,也可以把任务停止,scheduler把这些任务和触发器放到一个JobStore中,这里jobStore有内存形式的也有持久化形式的,当然也可以自定义扩展成独立的服务。

        它内部会通过一个调度线程QuartzSchedulerThread不断到JobStore中找出下次需要执行的任务,并把这些任务封装放到一个线程池ThreadPool中运行,它的组件结构如下图:

        各类的调用关系如下图:

        下面看看quartz的简单实现:

        首先是一个调度管理类:

        接下来实现job接口:

        测试主函数如下:

        运行结果如下:

Java中定时任务quartz如何将历史数据写入新表

       如果是linux,可以使用linux的cron服务来每天8点运行你的程序

       如果不是或者没有条件使用cron,可以考虑使用java的开源组件quartz,它完全支持cron表达式来声明定时任务,也易于和spring集成。楼上已经给出quartz的用法了。

       如果要纯粹自己写一个程序的话:

       public class Test {

        public static void main(String[] args) throws Exception{

        while(true){

        //睡到明天8点

        Thread.sleep(getDelay());

        System.out.println("起床啦~~");

        }

        }

        private static long getDelay(){

        //计算离下一次8点还有多久(毫秒)

        long delay = 0;

        Calendar c = Calendar.getInstance();

        c.set(Calendar.HOUR_OF_DAY, 23);

        c.set(Calendar.MINUTE, 59);

        c.set(Calendar.SECOND, 59);

        //计算当前离今天23:59:59有多少毫秒

        delay = c.getTimeInMillis() - System.currentTimeMillis();

        //加一秒到下一天,再加上8小时的毫秒

        delay = delay + 1000 + 60*60*8*1000;

        return delay;

        }

       }

       注意:这个程序有一个问题:就是如果print语句换成一个非常耗时的操作,以至于到第二天才执行完,那么就会跳过第二天8点直接到第三天八点了。不过按你的要求,输出一句话是没问题的。

       你也可以不用Thread.sleep,用Timer类也可以。

java中quartz定时任务的执行如何避免并发

       我建议的做法是在数据库中建一些Quartz的表,MySQL的建、删表脚本,最主要的修改是quartz.properties,如果你使用的是其他数据库,可以下载Quartz的distribution,在\docs\dbTables下。然后我们可以启动Bootstrap类,注册、运行定时任务。你可以发现MySQL的表中已经有此定时任务的记录了。

       然后你可以停止Bootstrap类,将Bootstrap类中关于注册、启动定时任务的代码删除或注释,然后启动Bootstrap类,看上一次操作注册的定时任务会不会继续运行。

       如无意外,看上一次操作注册的定时任务会继续运行。

分布式定时任务调度框架实践

       只要在detail的参数里加上一句话就行了,把这个job设置成有状态的job

       <property name="concurrent" value="false" />

       扩展:通过concurrent属性指定任务的类型,默认情况下封装为无状态的任务,如果希望目标封装为有状态的任务,仅需要将concurrent设置为false就可以了。Spring通过名为concurrent的属性指定任务的类型,能够更直接地描述到任务执行的方式(有状态的任务不能并发执行,无状态的任务可并发执行)

        分布式任务调度框架几乎是每个大型应用必备的工具,本文介绍了任务调度框架使用的需求背景和痛点,对业界普遍使用的开源分布式任务调度框架的使用进行了探究实践,并分析了这几种框架的优劣势和对自身业务的思考。

        一、业务背景

        1.1 为什么需要使用定时任务调度

        (1)时间驱动处理场景: 整点发送优惠券,每天更新收益,每天刷新标签数据和人群数据。

        (2)批量处理数据: 按月批量统计报表数据,批量更新短信状态,实时性要求不高。

        (3)异步执行解耦: 活动状态刷新,异步执行离线查询,与内部逻辑解耦。

        1.2 使用需求和痛点

        (1)任务执行监控告警能力。

        (2)任务可灵活动态配置,无需重启。

        (3)业务透明,低耦合,配置精简,开发方便。

        (4)易测试。

        (5)高可用,无单点故障。

        (6)任务不可重复执行,防止逻辑异常。

        (7)大任务的分发并行处理能力。

        二、开源框架实践与 探索

        2.1 Java 原生 Timer 和

        ScheduledExecutorService

        2.1.1 Timer使用

        Timer缺陷:

        由于上述缺陷,尽量不要使用Timer, idea中也会明确提示,使用ScheduledThreadPoolExecutor替代Timer 。

        2.1.2 ScheduledExecutorService使用

        ScheduledExecutorService对于Timer的缺陷进行了修补,首先ScheduledExecutorService内部实现是ScheduledThreadPool线程池,可以支持多个任务并发执行。

        对于某一个线程执行的任务出现异常,也会处理,不会影响其他线程任务的执行,另外ScheduledExecutorService是基于时间间隔的延迟,执行不会由于系统时间的改变发生变化。

        当然,ScheduledExecutorService也有自己的局限性:只能根据任务的延迟来进行调度,无法满足基于绝对时间和日历调度的需求。

        2.2 Spring Task

        2.2.1 Spring Task 使用

        spring task 是spring自主开发的轻量级定时任务框架,不需要依赖其他额外的包,配置较为简单。

        此处使用注解配置

        2.2.2 Spring Task缺陷

        Spring Task 本身不支持持久化,也没有推出官方的分布式集群模式,只能靠开发者在业务应用中自己手动扩展实现,无法满足可视化,易配置的需求。

        2.3 永远经典的 Quartz

        2.3.1 基本介绍

        Quartz框架是Java领域最著名的开源任务调度工具,也是目前事实上的定时任务标准,几乎全部的开源定时任务框架都是基于Quartz核心调度构建而成。

        2.3.2 原理解析

        核心组件和架构

        关键概念

        (1)Scheduler :任务调度器,是执行任务调度的控制器。本质上是一个计划调度容器,注册了全部Trigger和对应的JobDetail, 使用线程池作为任务运行的基础组件,提高任务执行效率。

        (2)Trigger :触发器,用于定义任务调度的时间规则,告诉任务调度器什么时候触发任务,其中CronTrigger是基于cron表达式构建的功能强大的触发器。

        (3)Calendar :日历特定时间点的集合。一个trigger可以包含多个Calendar,可用于排除或包含某些时间点。

        (4)JobDetail :是一个可执行的工作,用来描述Job实现类及其它相关的静态信息,如Job的名称、监听器等相关信息。

        (5)Job :任务执行接口,只有一个execute方法,用于执行真正的业务逻辑。

        (6)JobStore :任务存储方式,主要有RAMJobStore和JDBCJobStore,RAMJobStore是存储在JVM的内存中,有丢失和数量受限的风险,JDBCJobStore是将任务信息持久化到数据库中,支持集群。

        2.3.3 实践说明

        (1)关于Quartz的基本使用

        (2)业务使用要满足动态修改和重启不丢失, 一般需要使用数据库进行保存。

        (3)组件化

        (4)扩展

        2.3.4 缺陷和不足

        (1)需要把任务信息持久化到业务数据表,和业务有耦合。

        (2)调度逻辑和执行逻辑并存于同一个项目中,在机器性能固定的情况下,业务和调度之间不可避免地会相互影响。

        (3)quartz集群模式下,是通过数据库独占锁来唯一获取任务,任务执行并没有实现完善的负载均衡机制。

        2.4 轻量级神器 XXL-JOB

        2.4.1 基本介绍

        XXL-JOB是一个轻量级分布式任务调度平台,主打特点是平台化,易部署,开发迅速、学习简单、轻量级、易扩展,代码仍在持续更新中。

        主要提供了任务的动态配置管理、任务监控和统计报表以及调度日志几大功能模块,支持多种运行模式和路由策略,可基于对应执行器机器集群数量进行简单分片数据处理。

        2.4.2 原理解析

        2.1.0版本前核心调度模块都是基于quartz框架,2.1.0版本开始自研调度组件,移除quartz依赖 ,使用时间轮调度。

        2.4.3 实践说明

        详细配置和介绍参考官方文档。

        2.4.3.1 demo使用:

        @JobHandler(value="offlineTaskJobHandler") ,实现业务逻辑即可。(注:此次引入了dubbo,后文介绍)。

        (滑动可查看)

        示例2:分片广播任务。

        (滑动可查看)

        2.4.3.2 整合dubbo

        (1)引入dubbo-spring-boot-starter和业务facade jar包依赖。

        (滑动可查看)

        (2)配置文件加入dubbo消费端配置(可根据环境定义多个配置文件,通过profile切换)。

        (滑动可查看)

        (3)代码中通过@Reference注入facade接口即可。

        (滑动可查看)

        (4)启动程序加入@EnableDubboConfiguration注解。

        (滑动可查看)

        2.4.4 任务可视化配置

        内置了平台项目,方便了开发者对任务的管理和执行日志的监控,并提供了一些便于测试的功能。

        2.4.5 扩展

        (1)任务监控和报表的优化。

        (2)任务报警方式的扩展,比如加入告警中心,提供内部消息,短信告警。

        (3)对实际业务内部执行出现异常情况下的不同监控告警和重试策略。

        2.5 高可用 Elastic-Job

        2.5.1 基本介绍

        Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。

        Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。

        Elastic-Job-Cloud使用Mesos + Docker的解决方案,额外提供资源治理、应用分发以及进程隔离等服务。

        可惜的是已经两年没有迭代更新记录。

        2.5.2 原理解析

        2.5.3 实践说明

        2.5.3.1 demo使用

        (1)安装zookeeper,配置注册中心config,配置文件加入注册中心zk的配置。

        (滑动可查看)

        (滑动可查看)

        (2)配置数据源config,并配置文件中加入数据源配置。

        (滑动可查看)

        (滑动可查看)

        (3)配置事件config。

        (滑动可查看)

        (4)为了便于灵活配置不同的任务触发事件,加入ElasticSimpleJob注解。

        (滑动可查看)

        (5)对配置进行初始化。

        (滑动可查看)

        (6)实现 SimpleJob接口,按上文中方法整合dubbo, 完成业务逻辑。

        (滑动可查看)

        2.6 其余开源框架

        (1)Saturn :Saturn是唯品会开源的一个分布式任务调度平台,在Elastic Job的基础上进行了改造。

        (2)SIA-TASK :是宜信开源的分布式任务调度平台。

        三、优劣势对比和业务场景适配思考

        业务思考:

        四、结语

        对于并发场景不是特别高的系统来说,xxl-job配置部署简单易用,不需要引入多余的组件,同时提供了可视化的控制台,使用起来非常友好,是一个比较好的选择。希望直接利用开源分布式框架能力的系统,建议根据自身的情况来进行合适的选型。

        附:参考文献

        高可用架构

        改变互联网的构建方式

       好了,今天关于“java quartz 教程”的话题就讲到这里了。希望大家能够通过我的介绍对“java quartz 教程”有更全面、深入的认识,并且能够在今后的实践中更好地运用所学知识。