我是靠谱客的博主 慈祥墨镜,最近开发中收集的这篇文章主要介绍Quartz使用简介Quartz使用Spring整合Quartz操作示例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

简介

Quartz :Quartz Enterprise Job Scheduler

是一个定时任务调度框架。比如你遇到这样的问题:

  • 想在30分钟后,查看订单是否支付,未支付则取消订单

  • 想在每月29号,信用卡自动还款

  • ...

  • 想定时在某个时间,去做某件事(任务)。

Quartz是要做定时任务的调度,设置好触发时间规则,以及相应的任务(Job)即可。

Quartz使用

1.导入依赖

<dependencies>
    <!--Quartz任务调度-->
    <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.3</version>
    </dependency>
</dependencies>

2.定义Job

public class MyJob implements Job {

    /**
     * 工作类的具体实现,即需要定时执行的“某件事”
     * */

        //执行
        public void execute(JobExecutionContext context) throws JobExecutionException {
            //创建工作详情
            JobDetail jobDetail=context.getJobDetail();
            //获取工作的名称
            String jobName = jobDetail.getKey().getName();//任务名
            String jobGroup = jobDetail.getKey().getGroup();//任务group
            System.out.println("job执行,job:"+jobName+" group:"+jobGroup);
            System.out.println("工作....");
        }

}

3.API测试

public class SimpleTest {

    public static void main(String[] args) throws SchedulerException, ParseException {

        String tt="2022-10-27 23:27:00";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = sdf.parse(tt);

        //获得一个默认调度器
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        //定义一个Trigger,触发条件类
        Trigger  trigger = TriggerBuilder.newTrigger().
                withIdentity("r1", "g1").//定义name/group
                startNow() //加入到scheduler就立刻执行  一旦加入scheduler,立即生效,即开始计时
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(2)  //每两秒执行一次
                        .repeatForever())     //一直执行
                .endAt(date).build();//在xx时刻停止

        //定义一个JobDetail
        //定义Job类为HelloQuartz类,这是真正的执行逻辑所在
        JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("j1", "g1").build();//定义name/group
        //调度器 中加入 任务和触发器
        scheduler.scheduleJob(jobDetail,trigger);
        //调度器 中加入 任务和触发器
        scheduler.start();

    }
}

,可以选择时分秒

 限定时间,每两秒打印一次。

Spring整合Quartz

1.导入依赖

<dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.3</version>
        </dependency>



        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.1.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.1.6.RELEASE</version>
        </dependency>

2.定义Job

public class MyJob implements Job {

    /**
     * 工作类的具体实现,即需要定时执行的“某件事”
     * */

        //执行
        public void execute(JobExecutionContext context) throws JobExecutionException {
            //创建工作详情
            JobDetail jobDetail=context.getJobDetail();
            //获取工作的名称
            String jobName = jobDetail.getKey().getName();//任务名
            String jobGroup = jobDetail.getKey().getGroup();//任务group
            System.out.println("job执行,job:"+jobName+" group:"+jobGroup);
            System.out.println("工作....");
        }

}

3.配置xml

调度器 SchedulerFactoryBean

触发器 CronTriggerFactoryBean

JobDetail JobDetailFactoryBean

<?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.xsd">

    <!--
        Spring整合Quartz进行配置遵循下面的步骤:
        1:定义工作任务的Job
        2:定义触发器Trigger,并将触发器与工作任务绑定
        3:定义调度器,并将Trigger注册到Scheduler
     -->

    <!-- 1:定义任务的bean ,这里使用JobDetailFactoryBean,也可以使用MethodInvokingJobDetailFactoryBean ,配置类似-->
    <bean name="lxJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <!-- 指定job的名称 -->
        <property name="name" value="job1"/>
        <!-- 指定job的分组 -->
        <property name="group" value="job_group1"/>
        <!-- 指定具体的job类 -->
        <property name="jobClass" value="com.qianfeng.log.quartz.MyJob"/>
    </bean>

    <!-- 2:定义触发器的bean,定义一个Cron的Trigger,一个触发器只能和一个任务进行绑定 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 指定Trigger的名称 -->
        <property name="name" value="trigger1"/>
        <!-- 指定Trigger的名称 -->
        <property name="group" value="trigger_group1"/>
        <!-- 指定Tirgger绑定的JobDetail -->
        <property name="jobDetail" ref="lxJob"/>
        <!-- 指定Cron 的表达式 ,当前是每隔5s运行一次 -->
        <property name="cronExpression" value="*/5 * * * * ?" />
    </bean>

    <!-- 3.定义调度器,并将Trigger注册到调度器中 -->
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"/>
            </list>
        </property>
        <!-- 添加 quartz 配置,如下两种方式均可 -->
        <!--<property name="configLocation" value="classpath:quartz.properties"></property>-->
        <property name="quartzProperties">
            <value>
                # 指定调度器名称,实际类型为:QuartzScheduler
                org.quartz.scheduler.instanceName = MyScheduler
                # 指定连接池
                org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
                # 连接池线程数量
                org.quartz.threadPool.threadCount = 11
                # 优先级
                org.quartz.threadPool.threadPriority = 5
                # 不持久化job
                org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
            </value>
        </property>
    </bean>

操作

启动任务

工厂启动,调度器启动,任务调度开始

public static void main(String[] args) throws InterruptedException, SchedulerException {	
    // 工厂启动,任务启动,工厂关闭,任务停止
	ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
}

 这个时候运行,每五秒打印一次。

任务操作

删除任务

public static void main(String[] args) throws InterruptedException, SchedulerException {		
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    System.out.println("=============");
    StdScheduler scheduler = (StdScheduler) context.getBean("scheduler");
    System.out.println(scheduler.getClass());
    Thread.sleep(3000);
    // 删除Job
    scheduler.deleteJob(JobKey.jobKey("job1","job_group1"));
}

暂停、恢复

public static void main(String[] args) throws InterruptedException, SchedulerException {		
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    System.out.println("=============");
    StdScheduler scheduler = (StdScheduler) context.getBean("scheduler");
    System.out.println(scheduler.getClass());
    Thread.sleep(3000);
    // 暂停,恢复工作
    scheduler.pauseJob(JobKey.jobKey("job1","job_group1"));// 暂停工作
    Thread.sleep(3000);
    scheduler.resumeJob(JobKey.jobKey("job1","job_group1"));// 恢复工作
}

批量操作

public static void main(String[] args) throws InterruptedException, SchedulerException {		
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    System.out.println("=============");
    StdScheduler scheduler = (StdScheduler) context.getBean("scheduler");
    System.out.println(scheduler.getClass());
    Thread.sleep(3000);
    GroupMatcher<JobKey> group1 = GroupMatcher.groupEquals("group1");
    scheduler.pauseJobs(group1); // 暂停组中所有工作
    Thread.sleep(2000);
    scheduler.resumeJobs(group1); // 恢复组中所有工作 
}

<bean id="myJob" class="com.qianfeng.controller.IpSelect"/>

    <bean name="lxJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

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

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

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

如果Spring整合Quartz的  配置文件不可用,用上图的

示例

下图 定时器就可以自动执行

@Component
public class IpSelect {//定时器

    @Autowired
    private GetIpCountService getIpCountService;

    @Autowired
    private IpService ipService;

    public void execute() {

        int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

        for (int i : arr) {

            Integer ipCount = getIpCountService.getIp(i);

            if (ipCount > 10) {



                IpHT ipHT = new IpHT();
                ;
                ipHT.setUid(i);
                ipHT.setIpType("已封禁");
                Integer integer = ipService.updateType(ipHT);
                if (integer == 0) {
                    System.out.println("封禁成功");
                }
                System.out.println(i);
                if(i==10){
                    i=1;
                }

            }


        }


    }
}

最后

以上就是慈祥墨镜为你收集整理的Quartz使用简介Quartz使用Spring整合Quartz操作示例的全部内容,希望文章能够帮你解决Quartz使用简介Quartz使用Spring整合Quartz操作示例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部